kmeans是一種無監督的聚類問題,在使用前通常要進行數據標準化, 通常都是使用歐式距離來進行區分,主要是經過迭代質心的位置python
來進行分類,直到數據點不發生類別變化就中止,app
一次分類別,一次變換質心,就這樣不斷的迭代下去post
優點:使用方便
劣勢:1.K值難肯定字體
2. 複雜度與樣本數量呈線性關係this
3.很難發現形狀任意的簇spa
4.容易受初始點的影響code
python中使用 sklearn.cluster 模塊,使用的時候須要指定參數orm
第一步:導入數據,提取數據中的變量保存爲Xblog
import pandas as pd beer = pd.read_csv('data.txt', sep=' ') X = beer[["calories","sodium","alcohol","cost"]]
第二步:進行kmans聚類分析排序
from sklearn.cluster import KMeans km = KMeans(n_clusters=3).fit(X) #聚成三蔟 km2 = KMeans(n_clusters=2).fit(X) #聚成兩蔟 beer['cluster'] = km.labels_ #返回聚類的標籤結果 beer['cluster2'] = km2.labels_ beer.sort_values('cluster') #根據'cluster'進行排序
第三步:根據分類結果畫出帶顏色的散點圖,及其混淆矩陣
from pandas.tools.plotting import scatter_matrix cluster_center = km.cluster_centers_ cluster_center_2 = km2.cluster_centers_ # print(beer.groupby('cluster').mean()) #groupby進行快速分組,mean求平均 # # print(beer.groupby('cluster2').mean()) centers = beer.groupby("cluster").mean().reset_index() #reset_index()從新添加了序號 import matplotlib.pyplot as plt plt.rcParams['font.size'] = 14 #rcParams 用於修改字體的大小 import numpy as np color = np.array(['red', 'green', 'yellow', 'blue']) plt.scatter(beer['calories'], beer['alcohol'], c=color[beer['cluster']]) plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black') scatter_matrix(beer[["calories","sodium","alcohol","cost"]], s=100,alpha = 1 ,c=color[beer['cluster']],\ figsize=(10, 10)) #alpha 表明不透明的意思 plt.suptitle("With 3 centroids initialized") plt.show()
第四步:對數據進行標準化,再進行kmeans聚類
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaler = scaler.fit_transform(X) #進行轉換 new_X_scaler = pd.DataFrame(X_scaler, columns=["calories","sodium","alcohol","cost"]) km = KMeans(n_clusters=3).fit(X_scaler) beer['scaler_cluster'] = km.labels_ beer.sort_values('scaler_cluster') print(beer.groupby('scaler_cluster').mean()) scatter_matrix(new_X_scaler, alpha = 1 ,c=color[beer.scaler_cluster]) plt.show()
第五步:爲了比較處理先後的效果,咱們引入了輪廓係數 metrics.silhouette_score,發現未標準化的分類結果要好於標準化
from sklearn import metrics score_scaled = metrics.silhouette_score(X,beer.scaler_cluster) score = metrics.silhouette_score(X,beer.cluster) print(score_scaled, score)
第六步: 咱們使用輪廓係數(b(i)-a(i))/max(b(i), a(i)), b(i)一個點到本身蔟的距離,a(i)表示一個點到其餘蔟的距離,來挑選蔟的參數n_clusters
scores = [] for i in range(2, 15): print(metrics.silhouette_score(X,KMeans(n_clusters=i).fit(X).labels_)) #X變量,KMeans(n_clusters=i).fit(X).labels_分類獲得的標籤
scores.append(metrics.silhouette_score(X,KMeans(n_clusters=i).fit(X).labels_)) plt.plot(list(range(2, 15)), scores) plt.xlabel('迭代次數') plt.ylabel('輪廓係數') plt.show()