聚類是什么:聚類是無監督學習。是將相似的樣本分組的過程,每個組稱為一個簇,樣本沒有標簽。
聚類的應用:天氣特征、信息檢索(搜索引擎)
聚類的方法:1.基于相似度的聚類方法,使用的是m*n相似度矩陣或距離矩陣;2.基于特征的聚類方法,使用的是n*d的特征數據X;1的優勢:能把不同領域的數據相似度的度量融合進去,甚至可以考慮加入核函數來度量原始數據;2的優勢:直接用原始數據,避免因度量距離而丟失某些信息。
1.K-Means聚類
算法原理
K-means算法是硬聚類算法,是典型的基于原型的目標函數聚類方法的代表,它是數據點到原型的某種距離作為優化的目標函數,利用函數求極值的方法得到迭代運算的調整規則。K-means算法以歐氏距離作為相似度測度,它是求對應某一初始聚類中心向量V最優分類,使得評價指標J最小。算法采用誤差平方和準則函數作為聚類準則函數。
算法過程
1)從N個文檔隨機選取K個文檔作為質心
2)對剩余的每個文檔測量其到每個質心的距離,并把它歸到最近的質心的類
3)重新計算已經得到的各個類的質心
4)迭代2~3步直至新的質心與原質心相等或小于指定閾值,算法結束
具體如下:
輸入:k, data[n];
(1) 選擇k個初始中心點,例如c[0]=data[0],…c[k-1]=data[k-1];
(2) 對于data[0]….data[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;
(3) 對于所有標記為i點,重新計算c[i]={ 所有標記為i的data[j]之和}/標記為i的個數;
(4) 重復(2)(3),直到所有c[i]值的變化小于給定閾值。
如何選取K值最優
手肘法原理
SSE為誤差平方和,為第i個簇,P是
中的樣本點,
是
的質心,
為所有樣本的均值。SSE越小,聚類的效果越好。
關鍵代碼:
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
SSE = []
for k in range(1,9):
? ? teenager_cluster_model = KMeans(n_clusters = k)#構造聚類器
? ? teenager_cluster_model.fit(teenager_sns_zscore)
? ? SSE.append(teenager_cluster_model.inertia_)#estimator.inertia_獲取聚類準則的總和
X = range(1,9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X,SSE,'-o')
plt.show()
輪廓系數法
,a越小,b越大,效果越好
最近簇的定義:
代碼
Scores = []??# 存放輪廓系數
for k in range(2, 9):
????estimator = KMeans(n_clusters=k)??# 構造聚類器
????estimator.fit(np.array(mdl[['Age', 'Gender', 'Degree']]))
????Scores.append(silhouette_score(np.array(mdl[['Age', 'Gender', 'Degree']]), estimator.labels_, metric='euclidean'))
X = range(2, 9)
plt.xlabel('k')
plt.ylabel('輪廓系數')
plt.plot(X, Scores, 'o-')
plt.show()
2.層次聚類
實驗原理:https://www.cnblogs.com/zongfa/p/9344769.html
https://blog.csdn.net/sinat_29957455/article/details/80146093
https://blog.csdn.net/qq_32284189/article/details/81302182
關鍵代碼:
def tree(X, labelture):
? ? # row_clusters = linkage(pdist(df, metric='euclidean'), method='complete')? # 使用抽秘籍距離矩陣
? ? row_clusters = linkage(X, method='complete', metric='euclidean')
? ? print (pd.DataFrame(row_clusters, columns=['row label1', 'row label2', 'distance', 'no. of items in clust.'],
? ? ? ? ? ? ? ? ? ? ? ? index=['cluster %d' % (i + 1) for i in range(row_clusters.shape[0])]))
? ? # 層次聚類樹
? ? row_dendr = dendrogram(row_clusters, labels=labelture)
? ? plt.tight_layout()
? ? plt.ylabel('Euclidean distance')
? ? plt.show()
3.譜聚類
https://www.sogou.com/link?url=hedJjaC291P3yGwc7N55kLSc2ls_Ks2xuhK8zoHiSmEsBhAHv_p0nzh3ZfoXRJBg
https://mp.weixin.qq.com/s?src=11×tamp=1572660720&ver=1949&signature=ZH131bZ82S3cOmNYG3bgOQ8O3bBGWJ0GglsIjlXddxp0UjnFhZxeMMBRO-rIJBX3-yR4Md4h3ZU5ymjXEyZpIJcrh8wOuybWRYOfA7tHbGJvnEXUoELIRkmQ1-rJnp8K&new=1
# spectralClustering聚類算法
y_pred=cluster.SpectralClustering(n_clusters=2,affinity="nearest_neighbors").fit_predict(noisy_circles[0])
plt.scatter(noisy_circles[0][:,0],noisy_circles[0][:,1],marker='.',c=y_pred)
plt.title("spectralClustering")
plt.show()
4.基于密度的聚類DBSCAN
https://www.sogou.com/link?url=hedJjaC291OfPyaFZYFLI4KQWvqt63NBQgDhIHr5guXAv-KV-mr96Q..
from sklearn import metrics
def draw(m_kmeans,X,y_pred,n_clusters):
? ? centers = m_kmeans.cluster_centers_
? ? print(centers)
? ? plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=50, cmap='viridis')
? ? #中心點(質心)用紅色標出
? ? plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
? ? print("Calinski-Harabasz score:%lf"%metrics.calinski_harabaz_score(X, y_pred) )
? ? plt.title("K-Means (clusters = %d)"%n_clusters,fontsize=20)
m_kmeans.fit(X)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
? ? n_clusters=4, n_init=10, n_jobs=None, precompute_distances='auto',
? ? random_state=None, tol=0.0001, verbose=0)
y_pred = m_kmeans.predict(X)
draw(m_kmeans,X,y_pred,4)
5.Meanshift聚類
https://mp.weixin.qq.com/s?src=11×tamp=1572661953&ver=1949&signature=Bnx8rlLPbwOXrRceZwCwYfJqO1yoJWCKp6dkG0Iqi4-TmFmU7jXGSJiDcN2bCjhGTMXIDXDqF1r0QZhAyEgwogN4FsHyUZkySzNWqOGBiM6lgbr8*Lw4MtQSzPN6aMbg&new=1
https://mp.weixin.qq.com/s?src=11×tamp=1572661953&ver=1949&signature=Ru4MV-JtuoTVTShxiYjUfTKzptqP-k01BjZDaL0vwOwlF83sUqBtNsu2nAR2-Z0f40eeK*9YA6rcJNxAj7g3IUO8qlR0bTOjNLb0iP9MWdilDHvhqVLDJBhvgTO1BDDa&new=1