K-Means算法是典型的基于距離的非層次聚類算法,在最小化誤差函數(shù)的基礎(chǔ)上將數(shù)據(jù)換分為預(yù)定的類數(shù)K,采用距離作為相似性的評價指標(biāo),即認(rèn)為兩個對象的距離越近,其相似度就越大。
算法過程
- 從N個樣本數(shù)據(jù)中隨機(jī)選取K個對象作為初始的聚類中心
- 分別計算各個樣本到各個聚類中心的距離,將對象分配到最近的聚類中。
- 所有對象分配完后,重新計算K個聚類的中心。
- 與前一次計算得到的K個聚類中心比較,如果聚類中心發(fā)生變化,轉(zhuǎn)過程2,否則轉(zhuǎn)過程5
- 當(dāng)質(zhì)心不發(fā)生變化時,停止并輸出聚類結(jié)果
連續(xù)屬性
要先對各個屬性值進(jìn)行 零 - 均值規(guī)范,再進(jìn)行距離計算。在K-Means中聚類算法中,一般需要度量樣本之間的距離、樣本與簇之間的距離、簇與簇之間的距離
零-均值規(guī)范化
也稱為標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化,經(jīng)過處理的數(shù)據(jù)的均值為0,標(biāo)準(zhǔn)差為1。
轉(zhuǎn)化公式:當(dāng)前使用最多的數(shù)據(jù)標(biāo)準(zhǔn)化方法
實踐中,為得到較好的結(jié)果,通常選擇不同初始聚類中心,多次運行K-Means算法。
在所有對象分配完成后,重新計算K個聚類的中心時,對于連續(xù)數(shù)據(jù),聚類中心取該簇的均值,但當(dāng)樣本的某些屬性是分類變量時,均值可能無定義,可以使用K-眾數(shù)方法。
使用誤差平法和SSE(sum of squared errors)作為度量聚類質(zhì)量的目標(biāo)函數(shù),對于兩種不同的聚類結(jié)果,選擇誤差平方和較小的分類結(jié)果
案例
消費行為特征數(shù)據(jù) 聚類分析
采用K-Means算法,設(shè)定聚類個數(shù)K為3,最大迭代次數(shù)為500次,距離函數(shù)區(qū)歐式距離
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 初始化參數(shù)
inputfile = './data/consumption_data.xls' # 銷量及其他屬性數(shù)據(jù)
outputfile = './data/data_type_2.xls' # 保存結(jié)果
k = 3
iteration = 500
data = pd.read_excel(inputfile, index_col = 'Id') # 讀取數(shù)據(jù)
data_zs = 1.0 * (data - data.mean()) / data.std() # 數(shù)據(jù)標(biāo)準(zhǔn)化
model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration)
model.fit(data_zs)
# 打印結(jié)果
r1 = pd.Series(model.labels_).value_counts() # 統(tǒng)計各個類別數(shù)目
r2 = pd.DataFrame(model.cluster_centers_) # 找出聚類中心
r = pd.concat([r1, r2], axis=1) # 橫向連接(0是縱向), 得到聚類中心對應(yīng)得類別下的數(shù)目
r.columns = list(data.columns) + [u'類別數(shù)目'] # 重命名表頭
# 詳細(xì)輸出原始數(shù)據(jù)及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index )], axis=1)
r.columns = list(data.columns) + [u'聚類類別'] # 重命名表頭
r.to_excel(outputfile) # 保存結(jié)果
def density_plot(data):
plt.figure(figsize=(12, 6)) # 設(shè)置畫布大小
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號
p = data.plot(kind='kde', linewidth=2, subplots=True, sharex=False)
[p[i].set_ylabel(u'密度') for i in range(k)]
plt.legend()
return plt
pic_output = './data/pd_' # 概率密度圖文件名前綴
for i in range(k):
density_plot(data[r[u'聚類類別'] == i]).savefig(u'%s%s.png' %(pic_output, i))


總結(jié)
分群1特點:R間隔相對較大,主要集中在3080天;消費次數(shù)集中在015次;消費金額在:0~2000;
分群2特點:R間隔相對較小,主要集中在030天;消費次數(shù)集中在010次;消費金額在:0~1800;
分群3特點:R間隔相對較小,主要集中在030天;消費次數(shù)集中在1025次;消費金額在:500~2000;
對比分析
分群3時間間隔短,消費次數(shù)多,消費金額大,是高消費、高價值人群。
分群2時間間隔、消費次數(shù)、消費金額中等水平,代表著一般價值客戶。
分群1時間間隔長、消費次數(shù)較少、消費金額不是特別高,價值較低的客戶群體。
聚類分析算法評價
- purity 評價法
- RI 評價法
- F 值評價法