5.2.2 K-Mean聚類(lèi)算法

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

  1. 從N個(gè)樣本數(shù)據(jù)中隨機(jī)選取K個(gè)對(duì)象作為初始的聚類(lèi)中心
  2. 分別計(jì)算各個(gè)樣本到各個(gè)聚類(lèi)中心的距離,將對(duì)象分配到最近的聚類(lèi)中种樱。
  3. 所有對(duì)象分配完后蒙袍,重新計(jì)算K個(gè)聚類(lèi)的中心。
  4. 與前一次計(jì)算得到的K個(gè)聚類(lèi)中心比較嫩挤,如果聚類(lèi)中心發(fā)生變化害幅,轉(zhuǎn)過(guò)程2,否則轉(zhuǎn)過(guò)程5
  5. 當(dāng)質(zhì)心不發(fā)生變化時(shí)岂昭,停止并輸出聚類(lèi)結(jié)果

連續(xù)屬性
要先對(duì)各個(gè)屬性值進(jìn)行 零 - 均值規(guī)范以现,再進(jìn)行距離計(jì)算。在K-Means中聚類(lèi)算法中,一般需要度量樣本之間的距離邑遏、樣本與簇之間的距離佣赖、簇與簇之間的距離

零-均值規(guī)范化
也稱(chēng)為標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化,經(jīng)過(guò)處理的數(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)差

實(shí)踐中纪吮,為得到較好的結(jié)果俩檬,通常選擇不同初始聚類(lèi)中心,多次運(yùn)行K-Means算法碾盟。
在所有對(duì)象分配完成后棚辽,重新計(jì)算K個(gè)聚類(lèi)的中心時(shí),對(duì)于連續(xù)數(shù)據(jù)冰肴,聚類(lèi)中心取該簇的均值晚胡,但當(dāng)樣本的某些屬性是分類(lèi)變量時(shí),均值可能無(wú)定義嚼沿,可以使用K-眾數(shù)方法估盘。

使用誤差平法和SSE(sum of squared errors)作為度量聚類(lèi)質(zhì)量的目標(biāo)函數(shù),對(duì)于兩種不同的聚類(lèi)結(jié)果骡尽,選擇誤差平方和較小的分類(lèi)結(jié)果
連續(xù)屬性的SSE計(jì)算公式: SSE=\sum_{i=1}^k\sum_{x\epsilon E_i} dist(e_i, x)^2

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

簇 E_i的聚類(lèi)中心 e_i 計(jì)算公式為: e_i = {\frac 1n_i}\sum_{x\epsilon E_i}x

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

案例

消費(fèi)行為特征數(shù)據(jù) 聚類(lèi)分析

采用K-Means算法遣妥,設(shè)定聚類(lèi)個(gè)數(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'  # 銷(xiāo)量及其他屬性數(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)計(jì)各個(gè)類(lèi)別數(shù)目
r2 = pd.DataFrame(model.cluster_centers_)     # 找出聚類(lèi)中心

r = pd.concat([r1, r2], axis=1)  # 橫向連接(0是縱向), 得到聚類(lèi)中心對(duì)應(yīng)得類(lèi)別下的數(shù)目
r.columns = list(data.columns) + [u'類(lèi)別數(shù)目']  # 重命名表頭

# 詳細(xì)輸出原始數(shù)據(jù)及其類(lèi)別
r = pd.concat([data, pd.Series(model.labels_, index = data.index )], axis=1)
r.columns = list(data.columns) + [u'聚類(lèi)類(lèi)別']  # 重命名表頭
r.to_excel(outputfile)  # 保存結(jié)果

def density_plot(data):
    plt.figure(figsize=(12, 6))  # 設(shè)置畫(huà)布大小
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來(lái)正常顯示中文標(biāo)簽
    plt.rcParams['axes.unicode_minus'] = False    # 用來(lái)正常顯示負(fù)號(hào)
    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'聚類(lèi)類(lèi)別'] == i]).savefig(u'%s%s.png' %(pic_output, i))


image.png
image.png

總結(jié)
分群1特點(diǎn):R間隔相對(duì)較大箫踩,主要集中在3080天;消費(fèi)次數(shù)集中在015次谭贪;消費(fèi)金額在:0~2000;
分群2特點(diǎn):R間隔相對(duì)較小境钟,主要集中在030天;消費(fèi)次數(shù)集中在010次俭识;消費(fèi)金額在:0~1800;
分群3特點(diǎn):R間隔相對(duì)較小慨削,主要集中在030天;消費(fèi)次數(shù)集中在1025次套媚;消費(fèi)金額在:500~2000;
對(duì)比分析
分群3時(shí)間間隔短缚态,消費(fèi)次數(shù)多,消費(fèi)金額大堤瘤,是高消費(fèi)玫芦、高價(jià)值人群。
分群2時(shí)間間隔本辐、消費(fèi)次數(shù)桥帆、消費(fèi)金額中等水平医增,代表著一般價(jià)值客戶(hù)。
分群1時(shí)間間隔長(zhǎng)老虫、消費(fèi)次數(shù)較少叶骨、消費(fèi)金額不是特別高,價(jià)值較低的客戶(hù)群體张遭。

聚類(lèi)分析算法評(píng)價(jià)

  • purity 評(píng)價(jià)法
  • RI 評(píng)價(jià)法
  • F 值評(píng)價(jià)法
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邓萨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菊卷,更是在濱河造成了極大的恐慌缔恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洁闰,死亡現(xiàn)場(chǎng)離奇詭異歉甚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扑眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)纸泄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腰素,你說(shuō)我怎么就攤上這事聘裁。” “怎么了弓千?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵衡便,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我洋访,道長(zhǎng)镣陕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任姻政,我火速辦了婚禮呆抑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汁展。我一直安慰自己鹊碍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布善镰。 她就那樣靜靜地躺著妹萨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炫欺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天熏兄,我揣著相機(jī)與錄音品洛,去河邊找鬼树姨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桥状,可吹牛的內(nèi)容都是我干的帽揪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辅斟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼转晰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起士飒,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤查邢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后酵幕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體扰藕,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年芳撒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邓深。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笔刹,死狀恐怖芥备,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舌菜,我是刑警寧澤萌壳,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站酷师,受9級(jí)特大地震影響讶凉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜山孔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一懂讯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧台颠,春花似錦褐望、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荡碾,卻和暖如春谨读,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坛吁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工劳殖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铐尚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓哆姻,卻偏偏與公主長(zhǎng)得像宣增,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矛缨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

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