K-Means是一種聚類算法,無參照物,沒有訓練數據。
該算法的原理:有一群雜亂無章的點,分布混亂,現在規定把這些點分成K類,首先找到這K類的中心店,然后選擇一個距離(歐氏距離、曼哈頓距離、切比雪夫距離等),計算各點到各中心點之間的距離,離哪個中心店近就劃分到該中心店所屬的類中。
重復上述操作,直到類不發生變化,或者你也可以設置最大迭代次數,這樣即使類中心點發生變化,但是只要達到最大迭代次數就會結束。
下面通過一個實例:利用python給亞洲球隊做聚類分析(以下為學習資料摘抄)
?
針對上面的排名,我們首先需要做的是數據規范化。你可以把這些值劃分到 [0,1] 或者按照均值為 0,方差為 1 的正態分布進行規范化。
得到下面數據:
?
如果我們隨機選取中國、日本、韓國為三個類的中心點,我們就需要看下這些球隊到中心點的距離。(這里選擇常用的歐氏距離)
?
然后我們再重新計算這三個類的中心點,如何計算呢?最簡單的方式就是取平均值,然后根據新的中心點按照距離遠近重新分配球隊的分類,再根據球隊的分類更新中心點的位置。計算過程這里不展開,最后一直迭代(重復上述的計算過程:計算中心點和劃分分類)到分類不再發生變化,可以得到以下的分類結果:
?
下面用sklearn中的K-means
from sklearn.cluster import KMeans
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 類之后,就可以使用它的方法,最常用的是 fit 和 predict 這個兩個函數。你可以單獨使用 fit 函數和 predict 函數,也可以合并使用 fit_predict 函數。其中 fit(data) 可以對 data 數據進行 k-Means聚類。
predict(data) 可以針對 data 中的每個樣本,計算最近的類。
完整的代碼如下:
# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
# 輸入數據
data = pd.read_csv('data.csv', encoding='gbk')
train_x = data[["2019 年國際排名 ","2018 世界杯 ","2015 亞洲杯 "]]
df = pd.DataFrame(train_x)
kmeans = KMeans(n_clusters=3)
# 規范化到 [0,1] 空間
min_max_scaler=preprocessing.MinMaxScaler()
train_x=min_max_scaler.fit_transform(train_x)
# kmeans 算法
kmeans.fit(train_x)
predict_y = kmeans.predict(train_x)
# 合并聚類結果,插入到原數據中
result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename({0:u'聚類'},axis=1,inplace=True)
print(result)
?
結果:
國家 2019 年國際排名 2018 世界杯 2015 亞洲杯 聚類
0 中國 73 40 7 2
1 日本 60 15 5 0
2 韓國 61 19 2 0
3 伊朗 34 18 6 0
4 沙特 67 26 10 0
5 伊拉克 91 40 4 2
6 卡塔爾 101 40 13 1
7 阿聯酋 81 40 6 2
8 烏茲別克斯坦 88 40 8 2
9 泰國 122 40 17 1
10 越南 102 50 17 1
11 阿曼 87 50 12 1
12 巴林 116 50 11 1
13 朝鮮 110 50 14 1
14 印尼 164 50 17 1
15 澳洲 40 30 1 0
16 敘利亞 76 40 17 1
17 約旦 118 50 9 1
18 科威特 160 50 15 1
19 巴勒斯坦 96 50 16 1
示例數據已上傳到github:https://github.com/cystanford/kmeans
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
