最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

數(shù)據(jù)分析|k-means聚類原理

2020-01-17 17:43 作者:愛數(shù)據(jù)分析社區(qū)  | 我要投稿


K-Means 是一種非監(jiān)督學(xué)習(xí),解決的是聚類問題。K 代表的是 K 類,Means 代表的是中心,你可以理解這個(gè)算法的本質(zhì)是確定 K 類的中心點(diǎn)。當(dāng)你找到了中心點(diǎn),也就完成了聚類!

可以從以下三個(gè)角度來梳理k-means:

如何確定 K 類的中心點(diǎn)?
如何將其他點(diǎn)劃分到k類中?
如何區(qū)分k-means與k-近鄰算法?

為了對(duì)k-means有個(gè)感性的認(rèn)識(shí),我們從熟悉的場(chǎng)景亞洲足球隊(duì)的水平開始談起:

熟悉足球的朋友可能心理已經(jīng)有了預(yù)期?你可能會(huì)說,”伊朗,韓國(guó)“一流水平,中國(guó)”二流水平“,越南”三流水平“。這樣的猜測(cè)是基于我們的經(jīng)驗(yàn)。

那么,伊朗,中國(guó),越南就是三個(gè)等級(jí)的代表---中心。

那么如何確定k類的中心了?一開始我們是隨機(jī)指認(rèn)的,當(dāng)確定了中心點(diǎn)后,我們就可以按照距離將其它足球隊(duì)劃分到不同的類別中。

在這里我們默認(rèn)k=3,在工業(yè)界k的選擇是個(gè)難事!但我們可以通過其它方式來確定k,后文會(huì)講到。

從上面的描述中,我們可以抽象出聚類方法的步驟:

1. 隨機(jī)從數(shù)據(jù)集中選擇k個(gè)點(diǎn)作為我們聚類的中心點(diǎn);
2. 講每個(gè)點(diǎn)分配到離它最近的類中心點(diǎn),就形成了k類。然后重新計(jì)算每個(gè)類的中心點(diǎn)(比如取各類的均值作為新的中心點(diǎn))
3. 重復(fù)第2步,直到類不再發(fā)生變化,或者設(shè)置最大迭代次數(shù),讓算法收斂。

下面舉例說明,上述過程:

其中 2019 年國(guó)際足聯(lián)的世界排名,2015 年亞洲杯排名均為實(shí)際排名,2018年,很多球隊(duì)沒有入圍決賽,進(jìn)入決賽圈的有自己的排名,沒有進(jìn)入決賽圈我們按照以下原則來給其一個(gè)排名:

如果是亞洲區(qū)域入選賽12強(qiáng)的隊(duì)伍,設(shè)置為40名
如果沒有進(jìn)入亞洲區(qū)域預(yù)選賽,設(shè)置為50名

數(shù)據(jù)太過于分散,量級(jí)相差過大,通過特征工程中的最大最小歸一化來對(duì)數(shù)據(jù)進(jìn)行處理(也可以是z-評(píng)分歸一化),得到如下的數(shù)據(jù):


#最大最小歸一化處理
# coding:utf-8
from sklearn import preprocessing
import numpy as np
# 初始化數(shù)據(jù),每一行表示一個(gè)樣本,每一列表示一個(gè)特征
x = np.array([[ 0., -3., ?1.],
? ? ? ? ? ? ?[ 3., ?1., ?2.],
? ? ? ? ? ? ?[ 0., ?1., -1.]])
# 將數(shù)據(jù)進(jìn)行 [0,1] 規(guī)范化
min_max_scaler = preprocessing.MinMaxScaler()
minmax_x = min_max_scaler.fit_transform(x)
print minmax_x

#z-評(píng)分歸一化處理
from sklearn import preprocessing
import numpy as np
# 初始化數(shù)據(jù)
x = np.array([[ 0., -3., ?1.],
? ? ? ? ? ? ?[ 3., ?1., ?2.],
? ? ? ? ? ? ?[ 0., ?1., -1.]])
# 將數(shù)據(jù)進(jìn)行 Z-Score 規(guī)范化
scaled_x = preprocessing.scale(x)


接下來,開始計(jì)算各個(gè)足球隊(duì)舉例k類中心點(diǎn)的距離,距離的距離方式有很多,這里我們選擇歐式距離。

那么你是如何計(jì)算中國(guó)與日本的距離?
采用歐式距離,默認(rèn)19年,18年,15年的數(shù)據(jù)權(quán)重是一樣的,比如中國(guó)與日本的距離:

根據(jù)初始隨機(jī)選擇的k類中心點(diǎn):中國(guó),韓國(guó),日本,我們計(jì)算各俱樂部與三類中心點(diǎn)的距離,各俱樂部就近選擇中心點(diǎn)(就有了劃分這一列)。劃分這一列是我們迭代一次后的聚類結(jié)果,顯然不是最優(yōu)。

那么如何更新中心點(diǎn)了?

選擇同一類別下各個(gè)俱樂部三個(gè)指標(biāo)下各自的平均值作為新的聚類中心(聚類中心是三個(gè)特征值哦)。

為什么會(huì)使用均值作為中心點(diǎn)的選擇呢?這主要是由于我們目標(biāo)函數(shù)的設(shè)置有關(guān)。我們使用誤差平方和作為聚類的目標(biāo)函數(shù),就要求我們最終選擇均值為聚類中心點(diǎn)迭代的原則。

這樣不端迭代,直到達(dá)到迭代次數(shù)或是類別不再發(fā)生變化,結(jié)束。

最終的聚類結(jié)果,如下圖:

# coding: utf-8
from sklearn.cluster import KMeans
from sklearn import preprocessing
import pandas as pd
import numpy as np
# 輸入數(shù)據(jù)
#np.random.seed(1234) #不加隨機(jī)數(shù)種子,每次聚類結(jié)果都不一樣
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)

國(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


因?yàn)槌跏贾行狞c(diǎn)是隨機(jī)選擇的,所以每次的聚類結(jié)果都不一樣,這就要求我們加上隨機(jī)數(shù)種子!加入隨機(jī)數(shù)種子只是保證我們的結(jié)果穩(wěn)定不變,并不代表當(dāng)前的聚類結(jié)果就是最好的。也就是說,聚類結(jié)果依賴于初始中心點(diǎn)的選擇!
參數(shù)設(shè)置:

當(dāng)然 K-Means 只是 sklearn.cluster 一共提供了 9 種聚類方法,比如 Mean-shift,DBSCAN,Spectral clustering(譜聚類)等

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')

總結(jié):

如何區(qū)分k-means與knn:

k-means是聚類算法,knn是有監(jiān)督的分類算法;聚類沒有標(biāo)簽,分類有標(biāo)簽

聚類算法中的k是k類,knn中的k是k個(gè)最近的鄰居。

k-means優(yōu)點(diǎn):

計(jì)算簡(jiǎn)單,可解釋性強(qiáng)。

k-means缺點(diǎn):

需要確定分類數(shù)

,一般根據(jù)經(jīng)驗(yàn)或者已經(jīng)有預(yù)判,其次是根據(jù)R語(yǔ)言提供的暴力試錯(cuò)k值選擇最合適的分類數(shù)k。

初始值的選取會(huì)影響最終聚類效果,并且目標(biāo)函數(shù)

可能會(huì)達(dá)到局部最優(yōu)解。這個(gè)有相應(yīng)的改進(jìn)方法,包括k-means++和二分k-means。

算法本身的局限性:對(duì)于類似下面圓形的數(shù)據(jù)集,聚類效果很差,主要是算法原因。所以還有其他的聚類算法,比如基于密度的方法等。

不適合發(fā)現(xiàn)非凸形狀的簇或者大小差別較大的簇;

對(duì)噪聲和異常點(diǎn)比較敏感

end.

作者:求知鳥

掃描下方二維碼報(bào)名參加課程


數(shù)據(jù)分析|k-means聚類原理的評(píng)論 (共 條)

使用qq登录你需要登录后才可以评论。
察雅县| 枣庄市| 铁岭县| 盐城市| 寿光市| 视频| 靖远县| 高陵县| 阳曲县| 湖南省| 永兴县| 平南县| 新昌县| 德令哈市| 嘉兴市| 会宁县| 松潘县| 滕州市| 罗江县| 金秀| 文水县| 杨浦区| 双峰县| 邛崃市| 芦溪县| 息烽县| 陆川县| 霞浦县| 洪雅县| 永川市| 西充县| 姚安县| 青铜峡市| 三河市| 平陆县| 苍梧县| 昌黎县| 通城县| 成安县| 五华县| 凤城市|