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