K均值与DBSCAN聚类效果
K均值與DBSCAN聚類效果
K均值的發(fā)展狀況
K-means算法(Lloyod,1982)是簡單而又有效的統(tǒng)計聚類算法,使機器能夠將具有相同屬性的樣本歸置到一塊兒。K-均值算法的理論研究主要包括三塊內容:(1)模型泛化;(2)搜索策略設計;(3)距離函數(shù)設計。
其中就有基于期望最大化(EM)算法的混合模型就是K均值算法的一種泛化形式,為了避免落入較差的局部最優(yōu)點,在批量搜索的基礎上繼續(xù)進行增量搜索,可以提高聚類績效,以及wu,xiong和Chen對適用K均值的距離函數(shù)發(fā)現(xiàn),他們證明布萊格曼散度和余弦相似度都是K一均值距離的一個特例,并且針對化簡后目標函數(shù)設計的新增量搜索策略SBIL,能夠顯著提高某些距離函數(shù)的聚類績效,比如KL散度。
K一均值算法因其簡單和高效性,還可以與聚類、關聯(lián)以及分類等領域的其他方法結合起來,提高這些方法的數(shù)據分析性能。1.K均值算法與層次聚類法,因為凝聚層次法對數(shù)據中異常點非常敏感,而先用K均值法把數(shù)據分為K個簇再合成樹可以提高績效。2.K均值算法與關聯(lián)分析,數(shù)據之間存在強相關模式即來自同一簇,因此先進行關聯(lián)分析再用K均值聚類比較好。3K均值與模式分類,Wu等提出基于局部聚類的分類框架:COG,主要是再分類前對數(shù)據進行K均值聚類,以得到線性可分且比較均勻的子類 。
總結:如何搜索目標函數(shù)全局最優(yōu)點或者較好的局部最優(yōu)點仍然是難點,將算法與數(shù)據特點相結合是研究特點的要素之一。
k值怎樣取更佳?
1.手肘法
理論:手肘法的核心指標是SSE(sum of the squared errors,誤差平方和)
其中,Ci是第i個簇,p是Ci中的樣本點,mi是Ci的質心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。
手肘法的核心思想是:隨著聚類數(shù)k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和SSE自然會逐漸變小。并且,當k小于真實聚類數(shù)時,由于k的增大會大幅增加每個簇的聚合程度,故SSE的下降幅度會很大,而當k到達真實聚類數(shù)時,再增加k所得到的聚合程度回報會迅速變小,所以SSE的下降幅度會驟減,然后隨著k值的繼續(xù)增大而趨于平緩,也就是說SSE和k的關系圖是一個手肘的形狀,而這個肘部對應的k值就是數(shù)據的真實聚類數(shù)。當然,這也是該方法被稱為手肘法的原因。
2.輪廓系數(shù)法
理論: 該方法的核心指標是輪廓系數(shù)(Silhouette Coefficient),某個樣本點Xi的輪廓系數(shù)定義如下:
其中,a是Xi與同簇的其他樣本的平均距離,稱為凝聚度,b是Xi與最近簇中所有樣本的平均距離,稱為分離度。而最近簇的定義是
其中p是某個簇Ck中的樣本。事實上,簡單點講,就是用Xi到某個簇所有樣本平均距離作為衡量該點到該簇的距離后,選擇離Xi最近的一個簇作為最近簇。
如何確定K值實驗演示:
數(shù)據集來自: http://www.cse.msu.edu/~ptan/dmbook/software/
發(fā)現(xiàn)數(shù)據集的格式不能對應,使用的是自制數(shù)據,數(shù)據文件名:hand_data.xlsx
程序運行效果圖:
由圖可知,當SSE隨K值增加的時候SSE出現(xiàn)大幅度的降低然后出現(xiàn)小幅度的降低并且趨于平緩,而肘部數(shù)據即K=3時是最優(yōu)K值。手肘法比較符合K均值的核心思想。
由圖可知選擇最高點即K=3時,輪廓系數(shù)最大為最好的情況。
初始質心怎樣取更佳?
1.k-means++算法實現(xiàn)
1. import pandas as pd 2. import numpy as np 3. import matplotlib.pyplot as plt 4. from sklearn.cluster import KMeans 5. data = pd.read_csv('F:/Pycharm/data_Mining_homework/venv/data/chameleon.data.txt', delimiter=' ', names=['x','y']) 6. data.plot.scatter(x='x',y='y') 7. estimator = KMeans(n_clusters=10)#構造聚類器 8. estimator.fit(data)#聚類 9. label_pred = estimator.labels_ #獲取聚類標簽 10. centroids = estimator.cluster_centers_ #獲取聚類中心 11. inertia = estimator.inertia_ # 獲取聚類準則的總和 12. x1 = centroids[:,0] 13. y1 = centroids[:,1] 14. plt.scatter(x1,y1,c = 'r',marker='o',linewidths='10') 15. plt.show()
該段代碼實現(xiàn)的是k-means++算法對質心進行選擇的,具體的源碼如下:
1. # Pick first center randomly 2. center_id = random_state.randint(n_samples) 3. if sp.issparse(X): 4. centers[0] = X[center_id].toarray() 5. else: 6. centers[0] = X[center_id] 7. # Initialize list of closest distances and calculate current potential 8. closest_dist_sq = euclidean_distances( 9. centers[0, np.newaxis], X, Y_norm_squared=x_squared_norms, 10. squared=True) 11. current_pot = closest_dist_sq.sum() 12. # Pick the remaining n_clusters-1 points 13. for c in range(1, n_clusters): 14. # Choose center candidates by sampling with probability proportional 15. # to the squared distance to the closest existing center 16. rand_vals = random_state.random_sample(n_local_trials) * current_po 17. candidate_ids = np.searchsorted(stable_cumsum(closest_dist_sq), 18. rand_vals) 19. # Compute distances to center candidates 20. distance_to_candidates = euclidean_distances( 21. X[candidate_ids], X, Y_norm_squared=x_squared_norms, squared=True) 22. # Decide which candidate is the best 23. best_candidate = None 24. best_pot = None 25. best_dist_sq = None 26. for trial in range(n_local_trials): 27. # Compute potential when including center candidate 28. new_dist_sq = np.minimum(closest_dist_sq, 29. distance_to_candidates[trial]) 30. new_pot = new_dist_sq.sum() 31. # Store result if it is the best local trial so far 32. if (best_candidate is None) or (new_pot < best_pot): 33. best_candidate = candidate_ids[trial] 34. best_pot = new_pot 35. best_dist_sq = new_dist_sq該算法的核心思想是這樣進行的,首先是隨機的選擇第一個中心點,然后根據這個中心點和其余點的坐標來計算距離來計算可能的概率,接下來選取其余的n-1個質心的坐標,根據這些候選點距離中心點的距離的平方成反比的可能性進行選擇,然后把最好的中心點保存下來。這樣就實現(xiàn)了對初試質心的選擇,即選擇距離較遠的那些點。
同時我們可以根據算法知道,每次計算的中心點都不一樣,會有所差別,因為第一個點是隨機選擇的,然后如果第一個隨機點是離群點或者異常點將對聚類分析影響很大,下圖右邊可以明顯看出選擇的聚類中心點發(fā)生了變化,黑點右邊上邊有兩個,而紅點右邊只有一個。
現(xiàn)k-means++這種算法對于上述數(shù)據不能很好的處理聚類結果,我們選擇密度聚類的方法來優(yōu)化這個聚類效果。
2.密度聚類
主要使用的是基于密度聚類的DBSCAN算法,該算法的核心思想是給定一個半徑即Eps,在這個范圍內的點數(shù)都成一簇,同時任何與核心點足夠靠近的邊界點也放到與核心點相同的簇中。
代碼如下:
我們可以對比k-means算法聚類的效果圖,可以明顯的發(fā)現(xiàn)聚類的效果特別好,一共有10個分類,從-1到8每個類的顏色對應不同,而k-means的分類結果不確定,而且沒有很好的分出具體的類,對數(shù)據的凸顯性太差,而且對噪聲點和異常點特別的敏感,如果隨機選擇的過程中把這些點選擇造成結果的分類很不準確,而DBSCAN算法先按照收斂半徑Eps,分類出核心點,邊界點或噪聲點,然后運行中去除噪聲點的干擾,避免了k-means++算法的缺點之一,而DBSCAN算法的關鍵在于收斂半徑的選擇上,如果Eps太小,則每個點周圍都只有它自己,如果太大則全部都在一起,上述代碼是直接根據數(shù)據的特征選擇的esp =15.5,無法進行分類,一個好的思路就是采用grid,把數(shù)據集劃分為一個個小格子,每個小格子代表周圍 。
[1] .K—means CIustering:The Research Frontier and Future Directions
WU Junjiel, CHEN Jianl,XIONG Hui
[2] https://blog.csdn.net/qq_15738501/article/details/79036255
[3] https://blog.csdn.net/github_39261590/article/details/76910689
[4] http://www.cse.msu.edu/~ptan/dmbook/software/
[5] http://www.cse.msu.edu/~ptan/dmbook/tutorials/tutorial8/tutorial8.html#8.3.3-Group- Average
[6] https://blog.csdn.net/sinat_27612639/article/details/70257972
總結
以上是生活随笔為你收集整理的K均值与DBSCAN聚类效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dns被劫持怎么办,一文说清dns劫持与
- 下一篇: 仿链家地图找房_【前端-自如/链家/安居