機器學習經典算法之K-Means

1、簡介html

K-Means 是一種非監督學習,解決的是聚類問題。K 表明的是 K 類,Means 表明的是中心,你能夠理解這個算法的本質是肯定 K 類的中心點,當你找到了這些中心點,也就完成了聚類。程序員

/*請尊重做者勞動成果,轉載請標明原文連接:*/算法

/* https://www.cnblogs.com/jpcflyer/p/11117012.html * /微信

先請你和我思考一個場景,假設我有 20 支亞洲足球隊,想要將它們按照成績劃分紅 3 個等級,能夠怎樣劃分?dom

 

2、 K-Means 的工做原理機器學習

對亞洲足球隊的水平,你可能也有本身的判斷。好比一流的亞洲球隊有誰?你可能會說伊朗或韓國。二流的亞洲球隊呢?你可能說是中國。三流的亞洲球隊呢?你可能會說越南。函數

其實這些都是靠咱們的經驗來劃分的,那麼伊朗、中國、越南能夠說是三個等級的典型表明,也就是咱們每一個類的中心點。工具

因此回過頭來,如何肯定 K 類的中心點?一開始咱們是能夠隨機指派的,當你確認了中心點後,就能夠按照距離將其餘足球隊劃分到不一樣的類別中。學習

這也就是 K-Means 的中心思想,就是這麼簡單直接。你可能會問:若是一開始,選擇一流球隊是中國,二流球隊是伊朗,三流球隊是韓國,中心點選擇錯了怎麼辦?其實不用擔憂,K-Means 有自我糾正機制,在不斷的迭代過程當中,會糾正中心點。中心點在整個迭代過程當中,並非惟一的,只是你須要一個初始值,通常算法會隨機設置初始的中心點。spa

好了,那我來把 K-Means 的工做原理給你總結下:

選取 K 個點做爲初始的類中心點,這些點通常都是從數據集中隨機抽取的;

將每一個點分配到最近的類中心點,這樣就造成了 K 個類,而後從新計算每一個類的中心點;

重複第二步,直到類不發生變化,或者你也能夠設置最大迭代次數,這樣即便類中心點發生變化,可是隻要達到最大迭代次數就會結束。

 

3、 如何給亞洲球隊作聚類

對於機器來講須要數據才能判斷類中心點,因此我整理了 2015-2019 年亞洲球隊的排名,以下表所示。

我來講明一下數據概況。

其中 2019 年國際足聯的世界排名,2015 年亞洲盃排名均爲實際排名。2018 年世界盃中,不少球隊沒有進入到決賽圈,因此只有進入到決賽圈的球隊纔有實際的排名。若是是亞洲區預選賽 12 強的球隊,排名會設置爲 40。若是沒有進入亞洲區預選賽 12 強,球隊排名會設置爲 50。

 

針對上面的排名,咱們首先須要作的是數據規範化。 我先把數值都規範化到 [0,1] 的空間中,獲得瞭如下的數值表:

 

若是咱們隨機選取中國、日本、韓國爲三個類的中心點,咱們就須要看下這些球隊到中心點的距離。

距離有多種計算的方式,有關距離的計算我在 KNN 算法中也講到過。 歐氏距離是最經常使用的距離計算方式,這裏我選擇歐氏距離做爲距離的標準,計算每一個隊伍分別到中國、日本、韓國的距離,而後根據距離遠近來劃分。咱們看到大部分的隊,會和中國隊聚類到一塊兒。這裏我整理了距離的計算過程,好比中國和中國的歐氏距離爲 0,中國和日本的歐式距離爲 0.732003。若是按照中國、日本、韓國爲 3 個分類的中心點,歐氏距離的計算結果以下表所示:

 

而後咱們再從新計算這三個類的中心點,如何計算呢?最簡單的方式就是取平均值,而後根據新的中心點按照距離遠近從新分配球隊的分類,再根據球隊的分類更新中心點的位置。計算過程這裏不展開,最後一直迭代(重複上述的計算過程:計算中心點和劃分分類)到分類再也不發生變化,能夠獲得如下的分類結果:

 

因此咱們能看出來第一梯隊有日本、韓國、伊朗、沙特、澳洲;第二梯隊有中國、伊拉克、阿聯酋、烏茲別克斯坦;第三梯隊有卡塔爾、泰國、越南、阿曼、巴林、朝鮮、印尼、敘利亞、約旦、科威特和巴勒斯坦。

 

4、 如何使用 sklearn 中的 K-Means 算法

sklearn 是 Python 的機器學習工具庫,若是從功能上來劃分,sklearn 能夠實現分類、聚類、迴歸、降維、模型選擇和預處理等功能。這裏咱們使用的是 sklearn 的聚類函數庫,所以須要引用工具包,具體代碼以下:

1 from sklearn.cluster import KMeans

固然 K-Means 只是 sklearn.cluster 中的一個聚類庫,實際上包括 K-Means 在內,sklearn.cluster 一共提供了 9 種聚類方法,好比 Mean-shift,DBSCAN,Spectral clustering(譜聚類)等。這些聚類方法的原理和 K-Means 不一樣,這裏不作介紹。

咱們看下 K-Means 如何建立:

1 KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')

咱們能看到在 K-Means 類建立的過程當中,有一些主要的參數:

n_clusters : 即 K 值,通常須要多試一些 K 值來保證更好的聚類效果。你能夠隨機設置一些 K 值,而後選擇聚類效果最好的做爲最終的 K 值;

max_iter : 最大迭代次數,若是聚類很難收斂的話,設置最大迭代次數可讓咱們及時獲得反饋結果,不然程序運行時間會很是長;

n_init :初始化中心點的運算次數,默認是 10。程序是否能快速收斂和中心點的選擇關係很是大,因此在中心點選擇上多花一些時間,來爭取總體時間上的快速收斂仍是很是值得的。因爲每一次中心點都是隨機生成的,這樣獲得的結果就有好有壞,很是不肯定,因此要運行 n_init 次, 取其中最好的做爲初始的中心點。若是 K 值比較大的時候,你能夠適當增大 n_init 這個值;

algorithm :k-means 的實現算法,有「auto」 「full」「elkan」三種。通常來講建議直接用默認的"auto"。簡單說下這三個取值的區別,若是你選擇"full"採用的是傳統的 K-Means 算法,「auto」會根據數據的特色自動選擇是選擇「full」仍是「elkan」。咱們通常選擇默認的取值,即「auto」 。

 

在建立好 K-Means 類以後,就可使用它的方法,最經常使用的是 fit 和 predict 這個兩個函數。你能夠單獨使用 fit 函數和 predict 函數,也能夠合併使用 fit_predict 函數。其中 fit(data) 能夠對 data 數據進行 k-Means 聚類。 predict(data) 能夠針對 data 中的每一個樣本,計算最近的類。

如今咱們要完整地跑一遍 20 支亞洲球隊的聚類問題。

 1 # coding: utf-8
 2 
 3 from sklearn.cluster import KMeans
 4 
 5 from sklearn import preprocessing
 6 
 7 import pandas as pd
 8 
 9 import numpy as np
10 
11 # 輸入數據
12 
13 data = pd.read_csv('data.csv', encoding='gbk')
14 
15 train_x = data[["2019 年國際排名 ","2018 世界盃 ","2015 亞洲盃 "]]
16 
17 df = pd.DataFrame(train_x)
18 
19 kmeans = KMeans(n_clusters=3)
20 
21 # 規範化到 [0,1] 空間
22 
23 min_max_scaler=preprocessing.MinMaxScaler()
24 
25 train_x=min_max_scaler.fit_transform(train_x)
26 
27 # kmeans 算法
28 
29 kmeans.fit(train_x)
30 
31 predict_y = kmeans.predict(train_x)
32 
33 # 合併聚類結果,插入到原數據中
34 
35 result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
36 
37 result.rename({0:u'聚類'},axis=1,inplace=True)
38 
39 print(result)

運行結果:

 1 國家  2019 年國際排名  2018 世界盃  2015 亞洲盃  聚類
 2 
 3 中國         73       40        7   2
 4 
 5 日本         60       15        5   0
 6 
 7 韓國         61       19        2   0
 8 
 9 伊朗         34       18        6   0
10 
11 沙特         67       26       10   0
12 
13 伊拉克         91       40        4   2
14 
15 卡塔爾        101       40       13   1
16 
17 阿聯酋         81       40        6   2
18 
19 烏茲別克斯坦         88       40        8   2
20 
21 泰國        122       40       17   1
22 
23 越南        102       50       17   1
24 
25  阿曼         87       50       12   1
26 
27 巴林        116       50       11   1
28 
29 朝鮮        110       50       14   1
30 
31 印尼        164       50       17   1
32 
33 澳洲         40       30        1   0
34 
35 敘利亞         76       40       17   1
36 
37 約旦        118       50        9   1
38 
39  科威特        160       50       15   1
40 
41 巴勒斯坦         96       50       16   1

搜索關注微信公衆號「程序員姜小白」,獲取更新精彩內容哦。

相關文章
相關標籤/搜索