Download presentation
Presentation is loading. Please wait.
Published byBeatrice Pinard Modified 6年之前
1
4.資料集群 Clustering 集群範例一:鳶尾花各種集群模型 集群範例二:動物園的動物分群 集群範例三:電信公司的客戶分群
集群範例四:蛋白質攝取集群分析 4 2 3 1 集群範例三:電信公司的客戶分群
2
函數【kmeans】 【pamk】 【hclust】 【dbscan】檔案iris 150 records 5 fields
資料集群範例 一 函數【kmeans】 【pamk】 【hclust】 【dbscan】檔案iris 150 records 5 fields
3
集群分析 集群分析就是將異質的群體區隔,分成一些同質性較高的子群組或集群,不需要事先定義好該如何分類,也不需要訓練組資料,而是靠資料自身的相似性集群在一起,最常使用在市場區隔的應用上 分為分割式(Partitional)集群:K-Means和K-Medoids clustering 和非分割式(Non-Partitional)集群: Hierarchical和Density-based clustering
4
K-平均數(K-Means)集群 K平均法(K-means)是最受使用者歡迎以及最佳的集群分析法之一, K-Means演算法是麥昆(J. B. MacQueen)於1967年正式發表,由於原理簡單、計算快速,屬於前設式的集群演算法,也就是必須先設定集群的數量,然後根據該設定找出最佳的集群結構 分割式分群法,主要目標是在大量的資料點中找出代表性的資料點(cluster center),以少數代表點來代表大量的資料
5
分群注意事項 各個Cluster的大小: 要確保Cluster具代表性,原則上5-10% 為最低門檻
6
kmeans程式碼(iris) #kmeans iris: 150 records
#iris2=iris[,sapply(iris,is.numeric)] 取所有數值資料的指令 iris2=iris[,-5] set.seed(1234) kmeans.result=kmeans(iris2,3) kmeans.result table(iris$Species,kmeans.result$cluster) plot(iris2,col=kmeans.result$cluster)
7
預測分群結果與叢集中心
8
iris的散佈圖矩陣
9
利用集群找出離群值 #find 5 largest distances between objects and cluster centers kmeans.result$centers centers=kmeans.result$centers[kmeans.result$cluster,] head(centers) distances=sqrt(rowSums((iris2-centers)^2)) outliers=order(distances,decreasing=T)[1:5] outliers iris2[outliers,] plot(iris2[c("Sepal.Length", "Sepal.Width")], col=kmeans.result$cluster) points(kmeans.result$centers[,c("Sepal.Length", "Sepal.Width")], col=1:3, pch=8, cex=2) points(iris2[outliers,c("Sepal.Length", "Sepal.Width")], col=4, pch='+', cex=2)
10
找出5個離群值
11
離群值和集群中心
12
K-物件(K-Medoids)集群 以集群中最具代表性的點Medoid作為集群中心,亦即利用真正的物件代表集群
K-Medoids最經典演算法是分割環繞物件(PAM,Partitioning Around Medoids),由Kaufman and Rousseeuw於1987年提出 可使用cluster套件的pam函數 或fpc套件的pamk函數,使用此函數時,使用者不必決定分成幾組,但結果不一定理想
13
pamk的程式碼(自動分2群) iris2=iris[,-5] library(fpc) pamk.result=pamk(iris2)
table(iris$Species, pamk.result$pamobject$clustering) layout(matrix(c(1,2),1,2)) plot(pamk.result$pamobject) layout(matrix(1))
14
pamk執行結果
15
pamk集群圖0.69=(51* *0.62)/150
16
pam的程式碼(設定成3群) iris2=iris[,-5] library(cluster)
pam.result=pam(iris2,3) pam.result table(iris$Species,pam.result$clustering) layout(matrix(c(1,2),1,2)) plot(pam.result) layout(matrix(1))
17
pam函數執行結果
18
pam函數集群圖
19
Silhouette Measure Silhouett係數是用來比較集群模型的準則,計算每筆紀錄(B-A)/max(A,B)的平均值
Silhouett係數範圍在-1 (非常差的模型)和1 (非常好的模型)之間,可丟棄Silhouett係數為負值的模型
20
NbClust分群指標 亦可使用NbClust 套組的NbClust函數協助使用者決定分群的數目 程式碼如下:
library(NbClust) iris2=iris[,-5] result=NbClust(iris2,distance="euclidean",min.nc=2,max.nc=6,method="kmeans", index="all") Result$Best.partition
21
分群指標執行結果
22
階層式(Hierarchical)集群 以階層架構的方式反覆進行分裂或聚合 ,以產生最後的樹狀架構,可從樹狀圖取得任何想要的集群數,缺點是只適合小量資料 常見的階層式集群法包括: method=”average“,平均距離的平均連鎖法 method=”simple“,最小距離的單一連鎖法 method=”complete“,最大距離的完全連鎖法 method=”ward.D“或 "ward.D2",Ward的最小變異法
23
階層式集群程式碼 iris2=iris[,-5] index=sample(1:nrow(iris2),40) #抽取40筆
irissample=iris2[index,] hclust.result=hclust(dist(irissample),method= “ward.D2”) #dist函數 distance matrix compute hclust.result plot(hclust.result,labels=iris$Species[index]) rect.hclust(hclust.result,k=3,border="red") groups=cutree(hclust.result,k=3) table(iris$Species[index],groups)
24
階層式集群執行結果
25
階層式集群樹狀圖
26
密度基礎(Density-based)集群
fpc套件的DBSCAN演算法可提供數值資料的密度基礎集群 DBSCAN的兩個重要參數: eps:可達區域,定義鄰近地區的大小 MinPts:可達區域的最小點數 如果某個點鄰近地區的點數大於minPts ,那麼這個點就是一個密度點,所有從這個點可達的鄰近地區的點就被分成同一個集群
27
dbscan的程式碼 #dbscan iris: 150 records iris2=iris[,-5] library(fpc)
dbscan.result=dbscan(iris2,eps=0.42,MinPts=5) dbscan.result table(iris$Species, dbscan.result$cluster) plot(dbscan.result,iris2) plot(dbscan.result,iris2[c(1,4)]) plotcluster(iris2,dbscan.result$cluster)
28
dbscan的執行結果 0表示離群值的集群 預測結果有3個離群值歸為集群0
29
dbscan集群圖
30
放大的dbscan集群圖
31
dbscan分成4個集群
32
dbscan預測的程式碼 #predict irisnew2.txt 10 records
irisnew2=read.table("d:\\stella\\R\\iris_new2.txt",header=T, sep=",") irisnew2=na.exclude(irisnew2) pred=predict(dbscan.result,iris2,irisnew2) pred plot(dbscan.result,iris2[c(1,4)]) points(irisnew2[c(1,4)], pch="*", col=1+pred, cex=3)
33
預測到3個離群值的集群0(黑色)
34
函數【kmeans】檔案zoo.txt 101 records 18 fields
資料集群範例二 函數【kmeans】檔案zoo.txt 101 records 18 fields
35
動物園的動物分群應用 本範例的動物分群資料,取自美國加州大學歐文分校的機械學習資料庫,將動物分為7群 這個動物園的動物資料集包含了101筆的紀錄,資料當中包含了如下所列的18個欄位: 1. 動物的名字(animal name):唯一值 2. 是否具有毛髮(hair):Boolean值 3. 身體是否有羽毛(feathers):Boolean值 4. 是否會下蛋(eggs):Boolean值 5. 是否會產奶(milk):Boolean值 6. 是否在空中(airborne):Boolean值
36
7. 是否在水中(aquatic):Boolean值。 8. 是否會獵食(predator):Boolean值。 9
7. 是否在水中(aquatic):Boolean值。 8. 是否會獵食(predator):Boolean值。 9. 是否有牙齒(toothed):Boolean值。 10. 是否有骨幹(backbone):Boolean值。 11. 是否會呼吸(breathes):Boolean值。 12. 是否有毒(venomous):Boolean值。 13. 是否有鰭(fins):Boolean值。 14. 腿的數量(legs):{0,2,4,5,6,8}集合的數字。 15. 是否有尾巴(tail):Boolean值。 16. 是否被馴化(domestic):Boolean值。 17. 是否屬貓科(catsize):Boolean值。 18. 類型(type):在[1,7]範圍內的整數值
37
kmeans程式碼(zoo) #zoo: 101 records
zoo=read.table("d:\\stella\\R\\zoo.txt",header=T,sep=",") zoo=na.exclude(zoo) #kzoo=zoo[,sapply(zoo,is.numeric)] 取所有數值資料 kzoo=zoo[,-c(1,18)] set.seed(777) kresult=kmeans(kzoo,7) kresult table(kresult$cluster) table(zoo$type,kresult$cluster) kresult$size pie(kresult$size)
38
預測分群結果與叢集中心
39
矩陣分析結果
40
函數【kmeans】檔案churn.txt 1477 records 16 fields
資料集群範例三 函數【kmeans】檔案churn.txt 1477 records 16 fields
41
電信公司的客戶分群 以churn.txt這三個數值欄位當作分群模型的輸入
42
分群執行程式碼 churnall=read.table("d:\\stella\\R\\churn.txt",header=T, sep=",") churnall=na.exclude(churnall) churn=churnall[,c(2:4)] churn.result=kmeans(churn,5) table(churn.result$cluster) pie(table(churn.result$cluster)) table(churnall$CHURNED,churn.result$cluster) barplot(table(churnall$CHURNED,churn.result$cluster), col=2:4) legend(0,600,c("Current","Invol","Vol"),col=2:4,pch=15) head(churnall[churn.result$cluster==4,]) #Invol都在群集4
43
分群執行結果
44
檢視模型叢集大小
45
CHURNED在叢集中的分配圖
46
Modeler叢集大小
47
CHURNED在叢集中的分配圖
48
離群值與極端值偵測 #Univariate Outlier Detection boxplot.stats(churn[,3])$out
outliers=which(churn[,3] %in% boxplot.stats(churn[,3])$out) outliers extremes=subset(churn,churn[,3]>sd(churn[,3]*5)) extremes boxplot(churn[,3])
49
找出離群值與極端值
50
函數【pamk】 【kmeans】 檔案protein.txt 25 records 10 fields
資料集群範例四 函數【pamk】 【kmeans】 檔案protein.txt 25 records 10 fields
51
蛋白質攝取集群分析程式碼 proteinall=read.table("d:\\stella\\R\\protein.txt",header=T) (proteinall=na.exclude(proteinall)) protein=proteinall[,c(2:3)] library(fpc) protein.result=pamk(protein) protein.result$nc protein.result=kmeans(protein,3) #nc table(protein.result$cluster) df=data.frame(protein,Country= proteinall$Country,Cluster=protein.result$cluster) df[order(df$Cluster),] plot(protein,col=df$Cluster)
52
蛋白質攝取的檔案 *以紅肉白肉進行集群分析
53
蛋白質攝取集群分析結果 1紅白肉攝取少(北歐 地中海) 2白肉攝取多紅肉攝取少(東歐) 3紅白肉攝取多(西歐)
54
蛋白質攝取集群分析圖
Similar presentations