4.无监督学习--K-means聚类
K-means方法及其應(yīng)用
1.K-means聚類算法簡介:
k-means算法以k為參數(shù),把n個(gè)對象分成k個(gè)簇,使簇內(nèi)具有較高的相似度,而簇間的相似度較低。主要處理過程包括:
1.隨機(jī)選擇k個(gè)點(diǎn)作為初始的聚類中心。
2.對于剩下的點(diǎn),根據(jù)其與聚類中心的距離,將其歸入最近的簇。
3.對每個(gè)簇,計(jì)算所有點(diǎn)的均值作為新的聚類中心。
4.重復(fù)2、3直到聚類中心不再發(fā)生改變。
?
舉例:對于A、B、C、D、E這5個(gè)點(diǎn),我們先隨機(jī)選擇兩個(gè)點(diǎn)作為簇中心點(diǎn),標(biāo)記為紅色和黃色,對于第一次聚類結(jié)果,我們分別計(jì)算所有的點(diǎn)到這兩個(gè)中心點(diǎn)之間的聚類,我們發(fā)現(xiàn)A、B亮點(diǎn)離紅色的點(diǎn)距離更近,、C、D、E三點(diǎn)離黃色的點(diǎn)距離更近,所以在第一次聚類過程中,這個(gè)簇被定義為:A、B為一個(gè)簇,C、D、E為一個(gè)簇,接下來,我們將A、B這個(gè)簇重新計(jì)算它的聚類中心,標(biāo)記為一個(gè)更深顏色的紅色的點(diǎn),C、D、E重新計(jì)算他們的簇中心,為一個(gè)更深顏色的黃色的點(diǎn),我們再重新計(jì)算這些所有點(diǎn)距離簇中心的距離,接下來我們可以發(fā)現(xiàn),A、B、C可以聚為一個(gè)簇,而D、E相對于黃色的簇中心距離更近,所以D、E為一個(gè)簇,因此我們再重新計(jì)算一下A、B、C這個(gè)簇的簇中心和D、E的簇中心,第5張圖我們就可以看到簇的組成已經(jīng)相對穩(wěn)定了,那么這5個(gè)點(diǎn)的聚類結(jié)果就是:A、B、C為一個(gè)簇,D、E為一個(gè)簇,紅色和黃色的點(diǎn)分別為這兩個(gè)簇的簇中心;演變過程如下:
?
2.K-means的應(yīng)用
1.數(shù)據(jù)介紹:
現(xiàn)有1999年全國31個(gè)省份城鎮(zhèn)居民家庭平均每人全年消費(fèi)性支出的八個(gè)主要變量數(shù)據(jù),這8個(gè)變量分別是:食品、衣著、家庭設(shè)備用品及服務(wù)、醫(yī)療保健、交通和通訊、 ? ? ? ? ? ? ?娛樂教育文化服務(wù)、居住以及雜項(xiàng)商品和服務(wù)。利用已有數(shù)據(jù),對31個(gè)省份進(jìn)行聚類。
2.實(shí)驗(yàn)?zāi)康?#xff1a;
通過聚類,了解1999年各個(gè)省份的消費(fèi)水平在國內(nèi)的情況。
3.技術(shù)路線:sklearn.cluster.Kmeans
4.數(shù)據(jù)實(shí)例展示:
1999年全國31個(gè)省份城鎮(zhèn)居民家庭平均每人全年消費(fèi)性支出數(shù)據(jù),如下所示:
? ? ? ? ? ? ? ? ? ? ?
5.實(shí)驗(yàn)過程:
1.使用算法:K-means聚類算法
2.實(shí)現(xiàn)過程:
1.建立工程,導(dǎo)入sklearn相關(guān)包
import numpy as np
from sklearn.cluster import KMeans
2.加載數(shù)據(jù),創(chuàng)建K-means算法實(shí)例,并進(jìn)行訓(xùn)練,獲得標(biāo)簽:
? ? ? ? ? ? ?? ? ? ?
注意:調(diào)用K-Means方法所需參數(shù):
1.n_clusters:用于指定聚類中心的個(gè)數(shù)
2.init:初始聚類中心的初始化方法
3.max_iter:最大的迭代次數(shù)
4.一般調(diào)用時(shí)只用給出n_clusters即可,init默認(rèn)是k-means++,max_iter默認(rèn)是300。
其它參數(shù):
1.data:加載的數(shù)據(jù)
2.label:聚類后各數(shù)據(jù)所屬的標(biāo)簽
3.fit_predict():計(jì)算簇中心以及為簇分配序號
重點(diǎn)方法解釋:
data,cityName = loadData('city.txt') #loadData()函數(shù)是我們自己定義的,具體代碼為:
注意:loadData()函數(shù)中的readlines()方法一次性讀取整個(gè)文件,類似于.read()
? ? ? ?retCityName用于存儲城市名稱;
? ? ? ?retData 用于存儲城市的各項(xiàng)消費(fèi)信息
? ? ? ?返回值:返回城市名稱以及該城市的各項(xiàng)消費(fèi)信息
?
展示的時(shí)候:
?3.輸出標(biāo)簽,查看結(jié)果? ? ? ? ??
1.我們將城市按照消費(fèi)水平n_clusters分為幾個(gè)類,消費(fèi)水平相近的城市聚集在一類中。
2.expenses:聚類中心店的數(shù)值加和,也就是平均消費(fèi)水平。
? ? ? ? ?如下展示了:當(dāng)n_clusters=2時(shí),消費(fèi)水平的聚類結(jié)果,聚成2類,我們可以看到其中一類是:北京、天津、上海、浙江、福建、廣東、重慶、西藏為一個(gè)消費(fèi)水平的;
? ? ? ? ?
?當(dāng)n_clusters=3或者n_clusters=4的時(shí)候的聚類情況如下所示:
? ? ? ? ?
從這些結(jié)果中我們可以看出,消費(fèi)水平相近的城市聚集在一個(gè)類中,而北京、上海、廣東很穩(wěn)定的一直聚集在了同一個(gè)類中!
?如下,我們簡單談一下sklearn庫中的k-means算法的拓展和改進(jìn);
3.拓展 && 改進(jìn)
計(jì)算兩條數(shù)據(jù)相似性時(shí),Sklearn的K-Means默認(rèn)用的是歐氏距離。雖然還有余弦相似度,馬氏距離等多種方法,但sklearn中的k-means算法沒有設(shè)定計(jì)算距離方法的參數(shù)。如果大家想要使用自定義計(jì)算距離的計(jì)算方法,那么我們可以更改k-means的源代碼,在這里我們建議使用scipy.spatial.distance.cdist方法。
當(dāng)設(shè)置metric="cosine"的時(shí)候,就相當(dāng)于我們要使用余弦距離了,使用形式:scipy.spatial.distance.cdist(A,B,metric="cosine")
?
?
? ? ??
?
轉(zhuǎn)載于:https://www.cnblogs.com/python-machine/p/6941371.html
總結(jié)
以上是生活随笔為你收集整理的4.无监督学习--K-means聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v-show 与 v-if区别
- 下一篇: SDWebImage源码阅读(九)SDW