আপনি ঠিক বলেছেন যে কে-মানে ক্লাস্টারিং মিশ্রিত প্রকারের ডেটা দিয়ে করা উচিত নয়। যেহেতু কে-মানেগুলি মূলত ক্লাস্টারযুক্ত পর্যবেক্ষণ এবং ক্লাস্টার সেন্ট্রয়েডের মধ্যে ক্লাস্টার স্কোয়ারড ইউক্যালিডিয়ান দূরত্বকে হ্রাস করে এমন একটি পার্টিশন সন্ধানের জন্য একটি সহজ অনুসন্ধান অ্যালগরিদম, এটি কেবলমাত্র এমন ডেটা দিয়ে ব্যবহার করা উচিত যেখানে স্কোয়ারড ইউক্লিডিয়ান দূরত্বগুলি অর্থবহ হবে।
যখন আপনার ডেটাগুলিতে মিশ্র প্রকারের ভেরিয়েবল থাকে তখন আপনাকে গওয়ারের দূরত্ব ব্যবহার করা উচিত। সিভি ব্যবহারকারী @ttnphns এখানে গওয়ারের দূরত্বের দুর্দান্ত ধারণা রয়েছে । সংক্ষেপে, আপনি প্রতিটি ভেরিয়েবলের জন্য আপনার সারিগুলির জন্য একটি দূরত্বের ম্যাট্রিক্সটি ঘুরে দেখেন, এক ধরণের দূরত্ব ব্যবহার করে যা সেই ধরণের চলকের জন্য উপযুক্ত (যেমন, অবিচ্ছিন্ন ডেটার জন্য ইউক্যালিডিয়ান ইত্যাদি); সারি থেকে i ′ এর চূড়ান্ত দূরত্ব হ'ল প্রতিটি ভেরিয়েবলের জন্য দূরত্বের গড় (সম্ভবত ওজনযুক্ত) গড়। একটি বিষয় সচেতন হতে হবে তা হ'ল গওয়ারের দূরত্ব আসলে কোনও মেট্রিক নয় । তবুও, মিশ্র ডেটা সহ, গওয়ারের দূরত্বটি শহরের একমাত্র গেম। ii′
এই মুহুর্তে, আপনি যে কোনও ক্লাস্টারিং পদ্ধতি ব্যবহার করতে পারেন যা মূল ডেটা ম্যাট্রিক্সের পরিবর্তে দূরত্বের ম্যাট্রিক্সের উপরে কাজ করতে পারে। (নোট করুন যে কে- মানেগুলির পরবর্তীটির প্রয়োজন)) সর্বাধিক জনপ্রিয় পছন্দগুলি মেডোইডগুলি (পিএএম, যা মূলত কে-মানে হিসাবে একই, তবে সেন্ট্রয়েডের পরিবর্তে সর্বাধিক কেন্দ্রীয় পর্যবেক্ষণ ব্যবহার করে ) এর চারপাশে বিভাজন করছে , বিভিন্ন শ্রেণিবিন্যাসের ক্লাস্টারিং পদ্ধতির (উদাঃ) , মিডিয়ান, সিঙ্গল লিঙ্কেজ এবং সম্পূর্ণ লিঙ্কেজ; শ্রেণিবদ্ধ ক্লাস্টারিংয়ের সাথে আপনাকে সিদ্ধান্ত নিতে হবে চূড়ান্ত ক্লাস্টারের অ্যাসাইনমেন্টগুলি পেতে কোথায় ' গাছ কাটা উচিত ', এবং ডিবিএসসিএন যা আরও অনেক নমনীয় ক্লাস্টার আকারের অনুমতি দেয়।
এখানে একটি সাধারণ R
ডেমো (এনবি, আসলে 3 টি ক্লাস্টার রয়েছে তবে তথ্যগুলি বেশিরভাগ 2 টি ক্লাস্টারের মতো দেখতে উপযুক্ত):
library(cluster) # we'll use these packages
library(fpc)
# here we're generating 45 data in 3 clusters:
set.seed(3296) # this makes the example exactly reproducible
n = 15
cont = c(rnorm(n, mean=0, sd=1),
rnorm(n, mean=1, sd=1),
rnorm(n, mean=2, sd=1) )
bin = c(rbinom(n, size=1, prob=.2),
rbinom(n, size=1, prob=.5),
rbinom(n, size=1, prob=.8) )
ord = c(rbinom(n, size=5, prob=.2),
rbinom(n, size=5, prob=.5),
rbinom(n, size=5, prob=.8) )
data = data.frame(cont=cont, bin=bin, ord=factor(ord, ordered=TRUE))
# this returns the distance matrix with Gower's distance:
g.dist = daisy(data, metric="gower", type=list(symm=2))
আমরা পিএএম দিয়ে বিভিন্ন সংখ্যক ক্লাস্টার অনুসন্ধান করে শুরু করতে পারি:
# we can start by searching over different numbers of clusters with PAM:
pc = pamk(g.dist, krange=1:5, criterion="asw")
pc[2:3]
# $nc
# [1] 2 # 2 clusters maximize the average silhouette width
#
# $crit
# [1] 0.0000000 0.6227580 0.5593053 0.5011497 0.4294626
pc = pc$pamobject; pc # this is the optimal PAM clustering
# Medoids:
# ID
# [1,] "29" "29"
# [2,] "33" "33"
# Clustering vector:
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
# 1 1 1 1 1 2 1 1 1 1 1 2 1 2 1 2 2 1 1 1 2 1 2 1 2 2
# 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# 1 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2
# Objective function:
# build swap
# 0.1500934 0.1461762
#
# Available components:
# [1] "medoids" "id.med" "clustering" "objective" "isolation"
# [6] "clusinfo" "silinfo" "diss" "call"
এই ফলাফলগুলি শ্রেণিবিন্যাসের ক্লাস্টারিংয়ের ফলাফলগুলির সাথে তুলনা করা যেতে পারে:
hc.m = hclust(g.dist, method="median")
hc.s = hclust(g.dist, method="single")
hc.c = hclust(g.dist, method="complete")
windows(height=3.5, width=9)
layout(matrix(1:3, nrow=1))
plot(hc.m)
plot(hc.s)
plot(hc.c)
মিডিয়ান পদ্ধতিটি 2 (সম্ভবত 3) ক্লাস্টারগুলির পরামর্শ দেয়, এককটি কেবল 2 টি সমর্থন করে, তবে সম্পূর্ণ পদ্ধতিটি আমার চোখে 2, 3 বা 4 পরামর্শ দিতে পারে।
শেষ পর্যন্ত, আমরা ডিবিএসসান চেষ্টা করতে পারি। এটির জন্য দুটি প্যারামিটার উল্লেখ করতে হবে: এপিএস, 'পুনঃব্যবহারযোগ্যতা দূরত্ব' (দুইটি পর্যবেক্ষণকে কীভাবে একত্রে সংযুক্ত করতে হবে) এবং মিনিপটস (আপনি সর্বনিম্ন পয়েন্টগুলির একে অপরের সাথে সংযুক্ত হওয়া প্রয়োজন যেগুলি তাদের কল করতে ইচ্ছুক হওয়ার আগে? 'ক্লাস্টারের')। মিনিপটসের জন্য থাম্বের নিয়মটি মাত্রা সংখ্যার চেয়ে আরও বেশি ব্যবহার করা হয় (আমাদের ক্ষেত্রে 3 + 1 = 4) তবে খুব কম সংখ্যক থাকার প্রস্তাব দেওয়া হয় না। এর জন্য ডিফল্ট মান dbscan
5; আমরা এটি সঙ্গে থাকব। পুনঃব্যবহারযোগ্যতা দূরত্ব সম্পর্কে ভাবার একটি উপায় হ'ল দূরত্বের কত শতাংশ কোনও প্রদত্ত মানের তুলনায় কম তা দেখা। আমরা দূরত্বগুলির বন্টন পরীক্ষা করে এটি করতে পারি:
windows()
layout(matrix(1:2, nrow=1))
plot(density(na.omit(g.dist[upper.tri(g.dist)])), main="kernel density")
plot(ecdf(g.dist[upper.tri(g.dist)]), main="ECDF")
দূরত্বগুলি তাদের কাছে 'আরও কাছাকাছি' এবং 'আরও দূরে' এর দৃষ্টিভঙ্গি বোধগম্য গোষ্ঠীতে গুচ্ছবদ্ধ বলে মনে হয়। .3 এর মান মনে হয় দূরত্বের দুটি গ্রুপের মধ্যে সবচেয়ে পরিষ্কারভাবে পার্থক্য করে। ইপিএসের বিভিন্ন পছন্দগুলিতে আউটপুটটির সংবেদনশীলতা অন্বেষণ করতে, আমরা .2 এবং .4ও চেষ্টা করতে পারি:
dbc3 = dbscan(g.dist, eps=.3, MinPts=5, method="dist"); dbc3
# dbscan Pts=45 MinPts=5 eps=0.3
# 1 2
# seed 22 23
# total 22 23
dbc2 = dbscan(g.dist, eps=.2, MinPts=5, method="dist"); dbc2
# dbscan Pts=45 MinPts=5 eps=0.2
# 1 2
# border 2 1
# seed 20 22
# total 22 23
dbc4 = dbscan(g.dist, eps=.4, MinPts=5, method="dist"); dbc4
# dbscan Pts=45 MinPts=5 eps=0.4
# 1
# seed 45
# total 45
ব্যবহারের ফলে eps=.3
খুব পরিষ্কার সমাধান পাওয়া যায়, যা উপরের অন্যান্য পদ্ধতি থেকে আমরা যা দেখেছি তার সাথে (গুণগতভাবে কমপক্ষে) একমত হয়।
যেহেতু কোনও অর্থপূর্ণ ক্লাস্টার 1-নেস নেই , তাই আমাদের মিলিয়ে দেখার চেষ্টা করা উচিত যা বিভিন্ন ক্লাস্টারিংগুলি থেকে 'ক্লাস্টার 1' বলে। পরিবর্তে, আমরা টেবিল গঠন করতে পারি এবং যদি এক ফিটের মধ্যে 'ক্লাস্টার 1' নামে পরিচিত বেশিরভাগ পর্যবেক্ষণগুলিকে অন্য ক্লাস্টার 2 বলে, তবে আমরা দেখতে পাব যে ফলাফলগুলি এখনও যথেষ্ট পরিমাণে সমান। আমাদের ক্ষেত্রে, বিভিন্ন ক্লাস্টারিংগুলি বেশিরভাগ স্থিতিশীল এবং একই ক্লাস্টারে প্রতিবার একই পর্যবেক্ষণগুলি রাখে; শুধুমাত্র সম্পূর্ণ লিঙ্কেজ হায়ারারিকিকাল ক্লাস্টারিং পৃথক:
# comparing the clusterings
table(cutree(hc.m, k=2), cutree(hc.s, k=2))
# 1 2
# 1 22 0
# 2 0 23
table(cutree(hc.m, k=2), pc$clustering)
# 1 2
# 1 22 0
# 2 0 23
table(pc$clustering, dbc3$cluster)
# 1 2
# 1 22 0
# 2 0 23
table(cutree(hc.m, k=2), cutree(hc.c, k=2))
# 1 2
# 1 14 8
# 2 7 16
অবশ্যই, কোনও ক্লাস্টার বিশ্লেষণ আপনার ডেটার সত্যিকারের সুপ্ত ক্লাস্টারগুলিকে পুনরুদ্ধার করবে এমন কোনও গ্যারান্টি নেই। সত্যিকারের ক্লাস্টার লেবেলের অনুপস্থিতি (যা উপলব্ধ হতে পারে, বলুন, একটি লজিস্টিক রিগ্রেশন পরিস্থিতি) এর অর্থ প্রচুর পরিমাণে তথ্য অনুপলব্ধ। এমনকি খুব বড় ডেটাসেটের সাথেও, ক্লাস্টারগুলি পুরোপুরি পুনরুদ্ধারযোগ্য হওয়ার জন্য যথেষ্ট ভাল আলাদা নাও হতে পারে। আমাদের ক্ষেত্রে, যেহেতু আমরা প্রকৃত ক্লাস্টার সদস্যতা জানি, আমরা এটি আউটপুটটির সাথে এটি কতটা ভালভাবে দেখেছে তা তুলনা করতে পারি। আমি উপরে উল্লিখিত হিসাবে, আসলে 3 সুপ্ত ক্লাস্টার আছে, কিন্তু তথ্য পরিবর্তে 2 টি ক্লাস্টারের উপস্থিতি দেয়:
pc$clustering[1:15] # these were actually cluster 1 in the data generating process
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 1 1 1 1 1 2 1 1 1 1 1 2 1 2 1
pc$clustering[16:30] # these were actually cluster 2 in the data generating process
# 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
# 2 2 1 1 1 2 1 2 1 2 2 1 2 1 2
pc$clustering[31:45] # these were actually cluster 3 in the data generating process
# 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# 2 1 2 2 2 2 1 2 1 2 2 2 2 2 2