K-Means是一種聚類算法,無參照物,沒有訓(xùn)練數(shù)據(jù)。
該算法的原理:有一群雜亂無章的點(diǎn),分布混亂,現(xiàn)在規(guī)定把這些點(diǎn)分成K類,首先找到這K類的中心店,然后選擇一個(gè)距離(歐氏距離、曼哈頓距離、切比雪夫距離等),計(jì)算各點(diǎn)到各中心點(diǎn)之間的距離,離哪個(gè)中心店近就劃分到該中心店所屬的類中。
重復(fù)上述操作,直到類不發(fā)生變化,或者你也可以設(shè)置最大迭代次數(shù),這樣即使類中心點(diǎn)發(fā)生變化,但是只要達(dá)到最大迭代次數(shù)就會(huì)結(jié)束。
下面通過一個(gè)實(shí)例:利用python給亞洲球隊(duì)做聚類分析(以下為學(xué)習(xí)資料摘抄)
?
針對(duì)上面的排名,我們首先需要做的是數(shù)據(jù)規(guī)范化。你可以把這些值劃分到 [0,1] 或者按照均值為 0,方差為 1 的正態(tài)分布進(jìn)行規(guī)范化。
得到下面數(shù)據(jù):
?
如果我們隨機(jī)選取中國(guó)、日本、韓國(guó)為三個(gè)類的中心點(diǎn),我們就需要看下這些球隊(duì)到中心點(diǎn)的距離。(這里選擇常用的歐氏距離)
?
然后我們?cè)僦匦掠?jì)算這三個(gè)類的中心點(diǎn),如何計(jì)算呢?最簡(jiǎn)單的方式就是取平均值,然后根據(jù)新的中心點(diǎn)按照距離遠(yuǎn)近重新分配球隊(duì)的分類,再根據(jù)球隊(duì)的分類更新中心點(diǎn)的位置。計(jì)算過程這里不展開,最后一直迭代(重復(fù)上述的計(jì)算過程:計(jì)算中心點(diǎn)和劃分分類)到分類不再發(fā)生變化,可以得到以下的分類結(jié)果:
?
下面用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')
參數(shù)說明:
在創(chuàng)建好 K-Means 類之后,就可以使用它的方法,最常用的是 fit 和 predict 這個(gè)兩個(gè)函數(shù)。你可以單獨(dú)使用 fit 函數(shù)和 predict 函數(shù),也可以合并使用 fit_predict 函數(shù)。其中 fit(data) 可以對(duì) data 數(shù)據(jù)進(jìn)行 k-Means聚類。
predict(data) 可以針對(duì) data 中的每個(gè)樣本,計(jì)算最近的類。
完整的代碼如下:
# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
# 輸入數(shù)據(jù)
data = pd.read_csv('data.csv', encoding='gbk')
train_x = data[["2019 年國(guó)際排名 ","2018 世界杯 ","2015 亞洲杯 "]]
df = pd.DataFrame(train_x)
kmeans = KMeans(n_clusters=3)
# 規(guī)范化到 [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)
# 合并聚類結(jié)果,插入到原數(shù)據(jù)中
result = pd.concat((data,pd.DataFrame(predict_y)),axis=1)
result.rename({0:u'聚類'},axis=1,inplace=True)
print(result)
?
結(jié)果:
國(guó)家 2019 年國(guó)際排名 2018 世界杯 2015 亞洲杯 聚類
0 中國(guó) 73 40 7 2
1 日本 60 15 5 0
2 韓國(guó) 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 阿聯(lián)酋 81 40 6 2
8 烏茲別克斯坦 88 40 8 2
9 泰國(guó) 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
示例數(shù)據(jù)已上傳到github:https://github.com/cystanford/kmeans
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

