python k-means聚類

""
k-means聚類算法過程
1)從N個樣本數據中隨機選取k個做爲初始的聚類中心
2)分別計算每一個樣本到各個聚類中心的距離,將對象分配到距離最近的聚類中
3)全部對象分配完成後,從新計算K個聚類的中心
4)與前一次計算獲得的K個聚類中心比較,若是聚類中心發生變化,轉過程2),不然轉過程5)
5)當質心不發生變化時中止並輸出聚類結果算法

聚類的目標函數
使用偏差平方和SSE做爲度量聚類質量的目標函數,對於兩種不一樣的聚類結果,選擇偏差平方
和較小的分類結果
"""
##使用K-Means算法聚類消費行爲特徵數據app

#加載程序包函數

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
#讀取數據excel

inputfile = '../data/consumption_data.xls' #銷量及其餘屬性數據
outputfile = '../data/data_type.xls' #保存結果的文件名對象

data = pd.read_excel(inputfile, index_col = 'Id') #讀取數據
data_zs = 1.0*(data - data.mean())/data.std() #數據標準化
"""
R:最近一次消費時間間隔
F:消費頻率
M:消費總金額
"""input

# '利用SSE選擇k'
SSE = [] # 存放每次結果的偏差平方和
for k in range(1, 9):
estimator = KMeans(n_clusters=k) # 構造聚類器
estimator.fit(data_zs)
SSE.append(estimator.inertia_)
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()pandas

k=5 #設定聚類數據爲5類it

model = KMeans(n_clusters = k)
model.fit(data_zs) #開始聚類
io

#簡單打印結果
r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向鏈接(0是縱向),獲得聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名錶頭
print(r)import

##輸出偏差平方和SSESSE = model.inertia_print(SSE)#詳細輸出原始數據及其類別data_new = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1) #詳細輸出每一個樣本對應的類別data_new.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭data_new.to_excel(outputfile) #保存結果

相關文章
相關標籤/搜索