R語言的三種聚類方法
一、層次聚類
1)距離和相似系數(shù)
r語言中使用dist(x, method = “euclidean”,diag = FALSE, upper = FALSE, p = 2) 來計(jì)算距離。其中x是樣本矩陣或者數(shù)據(jù)框。method表示計(jì)算哪種距離。method的取值有:
- euclidean 歐幾里德距離,就是平方再開方
- maximum 切比雪夫距離
- manhattan 絕對值距離
- canberra Lance 距離
- minkowski 明科夫斯基距離,使用時要指定p值
- binary 定性變量距離.
定性變量距離: 記m個項(xiàng)目里面的 0:0配對數(shù)為m0 ,1:1配對數(shù)為m1,不能配對數(shù)為m2,距離=m1/(m1+m2);
diag 為TRUE的時候給出對角線上的距離。upper為TURE的時候給出上三角矩陣上的值。
r語言中使用scale(x, center = TRUE, scale = TRUE) 對數(shù)據(jù)矩陣做中心化和標(biāo)準(zhǔn)化變換。
如只中心化 scale(x,scale=F) ,
r語言中使用sweep(x, MARGIN, STATS, FUN=”-“, …) 對矩陣進(jìn)行運(yùn)算。MARGIN為1,表示行的方向上進(jìn)行運(yùn)算,為2表示列的方向上運(yùn)算。STATS是運(yùn)算的參數(shù)。FUN為運(yùn)算函數(shù),默認(rèn)是減法。下面利用sweep對矩陣x進(jìn)行極差標(biāo)準(zhǔn)化變換

有時候我們不是對樣本進(jìn)行分類,而是對變量進(jìn)行分類。這時候,我們不計(jì)算距離,而是計(jì)算變量間的相似系數(shù)。常用的有夾角和相關(guān)系數(shù)。
r語言計(jì)算兩向量的夾角余弦:

相關(guān)系數(shù)用cor函數(shù)
2)層次聚類法
層次聚類法。先計(jì)算樣本之間的距離。每次將距離最近的點(diǎn)合并到同一個類。然后,再計(jì)算類與類之間的距離,將距離最近的類合并為一個大類。不停的合并,直到合成了一個類。其中類與類的距離的計(jì)算方法有:最短距離法,最長距離法,中間距離法,類平均法等。比如最短距離法,將類與類的距離定義為類與類之間樣本的最段距離。。。
r語言中使用hclust(d, method = “complete”, members=NULL) 來進(jìn)行層次聚類。
其中d為距離矩陣。
method表示類的合并方法,有:
然后可以用rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,border = 2, cluster = NULL)來確定類的個數(shù)。 tree就是求出來的對象。k為分類的個數(shù),h為類間距離的閾值。border是畫出來的顏色,用來分類的。

二、動態(tài)聚類k-means
層次聚類,在類形成之后就不再改變。而且數(shù)據(jù)比較大的時候更占內(nèi)存。
動態(tài)聚類,先抽幾個點(diǎn),把周圍的點(diǎn)聚集起來。然后算每個類的重心或平均值什么的,以算出來的結(jié)果為分類點(diǎn),不斷的重復(fù)。直到分類的結(jié)果收斂為止。r語言中主要使用kmeans(x, centers, iter.max = 10, nstart = 1,algorithm =c(“Hartigan-Wong”, “Lloyd”,”Forgy”, “MacQueen”))來進(jìn)行聚類。centers是初始類的個數(shù)或者初始類的中心。iter.max是***迭代次數(shù)。nstart是當(dāng)centers是數(shù)字的時候,隨機(jī)集合的個數(shù)。algorithm是算法,默認(rèn)是***個。
使用knn包進(jìn)行Kmean聚類分析
將數(shù)據(jù)集進(jìn)行備份,將列newiris$Species置為空,將此數(shù)據(jù)集作為測試數(shù)據(jù)集
在數(shù)據(jù)集newiris上運(yùn)行Kmean聚類分析, 將聚類結(jié)果保存在kc中。在kmean函數(shù)中,將需要生成聚類數(shù)設(shè)置為
Cluster means: 每個聚類中各個列值生成的最終平均值
Clustering vector: 每行記錄所屬的聚類(2代表屬于第二個聚類,1代表屬于***個聚類,3代表屬于第三個聚類)
Within cluster sum of squares by cluster: 每個聚類內(nèi)部的距離平方和
(between_SS / total_SS = 88.4 %) 組間的距離平方和占了整體距離平方和的的88.4%,也就是說各個聚類間的距離做到了***
Available components: 運(yùn)行kmeans函數(shù)返回的對象所包含的各個組成部分
(“cluster”是一個整數(shù)向量,用于表示記錄所屬的聚類
“centers”是一個矩陣,表示每聚類中各個變量的中心點(diǎn)
“totss”表示所生成聚類的總體距離平方和
“withinss”表示各個聚類組內(nèi)的距離平方和
“tot.withinss”表示聚類組內(nèi)的距離平方和總量
“betweenss”表示聚類組間的聚類平方和總量
“size”表示每個聚類組中成員的數(shù)量)
創(chuàng)建一個連續(xù)表,在三個聚類中分別統(tǒng)計(jì)各種花出現(xiàn)的次數(shù)
根據(jù)***的聚類結(jié)果畫出散點(diǎn)圖,數(shù)據(jù)為結(jié)果集中的列”Sepal.Length”和”Sepal.Width”,顏色為用1,2,3表示的缺省顏色
在圖上標(biāo)出每個聚類的中心點(diǎn)
三、DBSCAN
動態(tài)聚類往往聚出來的類有點(diǎn)圓形或者橢圓形?;诿芏葤呙璧乃惴軌蚪鉀Q這個問題。思路就是定一個距離半徑,定最少有多少個點(diǎn),然后把可以到達(dá)的點(diǎn)都連起來,判定為同類。在r中的實(shí)現(xiàn)

其中eps是距離的半徑,minpts是最少多少個點(diǎn)。 scale是否標(biāo)準(zhǔn)化(我猜) ,method 有三個值raw,dist,hybird,分別表示,數(shù)據(jù)是原始數(shù)據(jù)避免計(jì)算距離矩陣,數(shù)據(jù)就是距離矩陣,數(shù)據(jù)是原始數(shù)據(jù)但計(jì)算部分距離矩陣。showplot畫不畫圖,0不畫,1和2都畫。countmode,可以填個向量,用來顯示計(jì)算進(jìn)度。用鳶尾花試一試
