日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K均值与DBSCAN聚类效果

發布時間:2023/12/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K均值与DBSCAN聚类效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

K均值與DBSCAN聚類效果

K均值的發展狀況

K-means算法(Lloyod,1982)是簡單而又有效的統計聚類算法,使機器能夠將具有相同屬性的樣本歸置到一塊兒。K-均值算法的理論研究主要包括三塊內容:(1)模型泛化;(2)搜索策略設計;(3)距離函數設計。
其中就有基于期望最大化(EM)算法的混合模型就是K均值算法的一種泛化形式,為了避免落入較差的局部最優點,在批量搜索的基礎上繼續進行增量搜索,可以提高聚類績效,以及wu,xiong和Chen對適用K均值的距離函數發現,他們證明布萊格曼散度和余弦相似度都是K一均值距離的一個特例,并且針對化簡后目標函數設計的新增量搜索策略SBIL,能夠顯著提高某些距離函數的聚類績效,比如KL散度。
K一均值算法因其簡單和高效性,還可以與聚類、關聯以及分類等領域的其他方法結合起來,提高這些方法的數據分析性能。1.K均值算法與層次聚類法,因為凝聚層次法對數據中異常點非常敏感,而先用K均值法把數據分為K個簇再合成樹可以提高績效。2.K均值算法與關聯分析,數據之間存在強相關模式即來自同一簇,因此先進行關聯分析再用K均值聚類比較好。3K均值與模式分類,Wu等提出基于局部聚類的分類框架:COG,主要是再分類前對數據進行K均值聚類,以得到線性可分且比較均勻的子類 。
總結:如何搜索目標函數全局最優點或者較好的局部最優點仍然是難點,將算法與數據特點相結合是研究特點的要素之一。

k值怎樣取更佳?

1.手肘法

理論:手肘法的核心指標是SSE(sum of the squared errors,誤差平方和)

其中,Ci是第i個簇,p是Ci中的樣本點,mi是Ci的質心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。
手肘法的核心思想是:隨著聚類數k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和SSE自然會逐漸變小。并且,當k小于真實聚類數時,由于k的增大會大幅增加每個簇的聚合程度,故SSE的下降幅度會很大,而當k到達真實聚類數時,再增加k所得到的聚合程度回報會迅速變小,所以SSE的下降幅度會驟減,然后隨著k值的繼續增大而趨于平緩,也就是說SSE和k的關系圖是一個手肘的形狀,而這個肘部對應的k值就是數據的真實聚類數。當然,這也是該方法被稱為手肘法的原因。

2.輪廓系數法

理論: 該方法的核心指標是輪廓系數(Silhouette Coefficient),某個樣本點Xi的輪廓系數定義如下:

其中,a是Xi與同簇的其他樣本的平均距離,稱為凝聚度,b是Xi與最近簇中所有樣本的平均距離,稱為分離度。而最近簇的定義是

其中p是某個簇Ck中的樣本。事實上,簡單點講,就是用Xi到某個簇所有樣本平均距離作為衡量該點到該簇的距離后,選擇離Xi最近的一個簇作為最近簇。

求出所有樣本的輪廓系數后再求平均值就得到了平均輪廓系數。平均輪廓系數的取值范圍為[-1,1],且簇內樣本的距離越近,簇間樣本距離越遠,平均輪廓系數越大,聚類效果越好。那么,很自然地,平均輪廓系數最大的k便是最佳聚類數。

如何確定K值實驗演示:

數據集來自: http://www.cse.msu.edu/~ptan/dmbook/software/
發現數據集的格式不能對應,使用的是自制數據,數據文件名:hand_data.xlsx
程序運行效果圖:


由圖可知,當SSE隨K值增加的時候SSE出現大幅度的降低然后出現小幅度的降低并且趨于平緩,而肘部數據即K=3時是最優K值。手肘法比較符合K均值的核心思想。


由圖可知選擇最高點即K=3時,輪廓系數最大為最好的情況。

初始質心怎樣取更佳?

1.k-means++算法實現

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()


該段代碼實現的是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個質心的坐標,根據這些候選點距離中心點的距離的平方成反比的可能性進行選擇,然后把最好的中心點保存下來。這樣就實現了對初試質心的選擇,即選擇距離較遠的那些點。
同時我們可以根據算法知道,每次計算的中心點都不一樣,會有所差別,因為第一個點是隨機選擇的,然后如果第一個隨機點是離群點或者異常點將對聚類分析影響很大,下圖右邊可以明顯看出選擇的聚類中心點發生了變化,黑點右邊上邊有兩個,而紅點右邊只有一個。
![在這里插入圖片描述](https://img-blog.csdnimg.cn/20200626104308383.png
我們可以發現k-means++這種算法對于上述數據不能很好的處理聚類結果,我們選擇密度聚類的方法來優化這個聚類效果。

2.密度聚類

主要使用的是基于密度聚類的DBSCAN算法,該算法的核心思想是給定一個半徑即Eps,在這個范圍內的點數都成一簇,同時任何與核心點足夠靠近的邊界點也放到與核心點相同的簇中。
代碼如下:

1. import pandas as pd 2. import numpy as np 3. import matplotlib.pyplot as plt 4. from sklearn.cluster import KMeans 5. from sklearn.cluster import DBSCAN 6. data = pd.read_csv('F:/Pycharm/data_Mining_homework/venv/data/chameleon.data.txt', delimiter=' ', names=['x','y']) 7. data.plot.scatter(x='x',y='y') 8. db = DBSCAN(eps=15.5, min_samples=5).fit(data) 9. core_samples_mask = np.zeros_like(db.labels_, dtype=bool) 10. core_samples_mask[db.core_sample_indices_] = True 11. labels = pd.DataFrame(db.labels_,columns=['Cluster ID']) 12. result = pd.concat((data,labels), axis=1) 13. result.plot.scatter(x='x',y='y',c='Cluster ID', colormap='jet') 14. plt.show()



我們可以對比k-means算法聚類的效果圖,可以明顯的發現聚類的效果特別好,一共有10個分類,從-1到8每個類的顏色對應不同,而k-means的分類結果不確定,而且沒有很好的分出具體的類,對數據的凸顯性太差,而且對噪聲點和異常點特別的敏感,如果隨機選擇的過程中把這些點選擇造成結果的分類很不準確,而DBSCAN算法先按照收斂半徑Eps,分類出核心點,邊界點或噪聲點,然后運行中去除噪聲點的干擾,避免了k-means++算法的缺點之一,而DBSCAN算法的關鍵在于收斂半徑的選擇上,如果Eps太小,則每個點周圍都只有它自己,如果太大則全部都在一起,上述代碼是直接根據數據的特征選擇的esp =15.5,無法進行分類,一個好的思路就是采用grid,把數據集劃分為一個個小格子,每個小格子代表周圍 。

[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聚类效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。