5.2.2 K-Mean聚類算法

K-Means算法是典型的基于距離的非層次聚類算法,在最小化誤差函數(shù)的基礎(chǔ)上將數(shù)據(jù)換分為預(yù)定的類數(shù)K,采用距離作為相似性的評價指標(biāo),即認(rèn)為兩個對象的距離越近,其相似度就越大。
算法過程

  1. 從N個樣本數(shù)據(jù)中隨機(jī)選取K個對象作為初始的聚類中心
  2. 分別計算各個樣本到各個聚類中心的距離,將對象分配到最近的聚類中。
  3. 所有對象分配完后,重新計算K個聚類的中心。
  4. 與前一次計算得到的K個聚類中心比較,如果聚類中心發(fā)生變化,轉(zhuǎn)過程2,否則轉(zhuǎn)過程5
  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)化方法
x^* = \frac{x - \bar x} {\sigma}
\bar x 為原始數(shù)據(jù)的均值, \sigma為原始數(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é)果
連續(xù)屬性的SSE計算公式: SSE=\sum_{i=1}^k\sum_{x\epsilon E_i} dist(e_i, x)^2

文檔數(shù)據(jù)的SSE計算公式: SSE =\sum_{i=1}^k\sum_{x\epsilon E_i}cos(e_i, x)^2

簇 E_i的聚類中心 e_i 計算公式為: e_i = {\frac 1n_i}\sum_{x\epsilon E_i}x

E_i : 第i個簇
K: 聚類簇的個數(shù)
x: 對象樣本
e_i: 簇E_i的聚類中心
n_i: 第i個簇中樣本的個數(shù)

案例

消費行為特征數(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))


image.png
image.png

總結(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 值評價法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 聚類算法 前面介紹的集中算法都是屬于有監(jiān)督機(jī)器學(xué)習(xí)方法,這章和前面不同,介紹無監(jiān)督學(xué)習(xí)算法,也就是聚類算法。在無監(jiān)...
    飄涯閱讀 41,753評論 3 51
  • 本篇結(jié)構(gòu) 簡介 聚類算法的分類 K-Means聚類算法 DBSCAN聚類算法 本篇介紹了聚類算法的種類,重點關(guān)注K...
    w1992wishes閱讀 7,700評論 0 14
  • K-Means原理K-Means算法的思想很簡單,對于給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。...
    yalesaleng閱讀 5,126評論 0 6
  • 1. 聚類分析的典型應(yīng)用場景 聚類分析的一個重要用途就是針對目標(biāo)群體進(jìn)行多指標(biāo)的群體劃分,類似這種目標(biāo)群體的分類就...
    熊定坤閱讀 30,528評論 0 4
  • 今天是什么日子 起床:7:30 就寢:8:30 天氣:陰天 心情:很美麗 紀(jì)念日:第一天用簡書 任務(wù)清單 昨日完成...
    沉穩(wěn)大氣的小金魚閱讀 195評論 0 1

友情鏈接更多精彩內(nèi)容