聚類

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()
複製代碼

相關文章
相關標籤/搜索