K-means 在 Python 中的實現
(點擊
上方藍字
,快速關注我們)
來源:Stardustsky
segmentfault.com/a/1190000010863236
如有好文章投稿,請點擊 → 這裡了解詳情
K-means演算法簡介
K-means是機器學習中一個比較常用的演算法,屬於無監督學習演算法,其常被用於數據的聚類,只需為它指定簇的數量即可自動將數據聚合到多類中,相同簇中的數據相似度較高,不同簇中數據相似度較低。
K-menas的優缺點:
優點:
原理簡單
速度快
對大數據集有比較好的伸縮性
缺點:
需要指定聚類 數量K
對異常值敏感
對初始值敏感
K-means的聚類過程
其聚類過程類似於梯度下降演算法,建立代價函數並通過迭代使得代價函數值越來越小
適當選擇c個類的初始中心;
在第k次迭代中,對任意一個樣本,求其到c個中心的距離,將該樣本歸到距離最短的中心所在的類;
利用均值等方法更新該類的中心值;
對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。
該演算法的最大優勢在於簡潔和快速。演算法的關鍵在於初始中心的選擇和距離公式。
K-means 實例展示
python中km的一些參數:
sklearn
.
cluster
.
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"
)
n_clusters: 簇的個數,即你想聚成幾類
init: 初始簇中心的獲取方法
n_init: 獲取初始簇中心的更迭次數,為了彌補初始質心的影響,演算法默認會初始10個質心,實現演算法,然後返回最好的結果。
max_iter: 最大迭代次數(因為kmeans演算法的實現需要迭代)
tol: 容忍度,即kmeans運行準則收斂的條件
precompute_distances:是否需要提前計算距離,這個參數會在空間和時間之間做權衡,如果是True 會把整個距離矩陣都放到內存中,auto 會默認在數據樣本大於featurs*samples 的數量大於12e6 的時候False,False 時核心實現的方法是利用Cpython 來實現的
verbose: 冗長模式(不太懂是啥意思,反正一般不去改默認值)
random_state: 隨機生成簇中心的狀態條件。
copy_x: 對是否修改數據的一個標記,如果True,即複製了就不會修改數據。bool 在scikit-learn 很多介面中都會有這個參數的,就是是否對輸入數據繼續copy 操作,以便不修改用戶的輸入數據。這個要理解Python 的內存機制才會比較清楚。
n_jobs: 並行設置
algorithm: kmeans的實現演算法,有:』auto』, 『full』, 『elkan』, 其中 『full』表示用EM方式實現
雖然有很多參數,但是都已經給出了默認值。所以我們一般不需要去傳入這些參數,參數的。可以根據實際需要來調用。
下面展示一個代碼例子
from
sklearn
.
cluster
import
KMeans
from
sklearn
.
externals
import
joblib
from
sklearn
import
cluster
import
numpy
as
np
# 生成10*3的矩陣
data
=
np
.
random
.
rand
(
10
,
3
)
data
# 聚類為4類
estimator
=
KMeans
(
n_clusters
=
4
)
# fit_predict表示擬合+預測,也可以分開寫
res
=
estimator
.
fit_predict
(
data
)
# 預測類別標籤結果
lable_pred
=
estimator
.
labels_
# 各個類別的聚類中心值
centroids
=
estimator
.
cluster_centers_
# 聚類中心均值向量的總和
inertia
=
estimator
.
inertia_
lable_pred
centroids
inertia
代碼執行結果
[
0
2
1
0
2
2
0
3
2
0
]
[[
0.3028348
0.25183096
0.62493622
]
[
0.88481287
0.70891813
0.79463764
]
[
0.66821961
0.54817207
0.30197415
]
[
0.11629904
0.85684903
0.7088385
]]
0.570794546829
為了更直觀的描述,這次在圖上做一個展示,由於圖像上繪製二維比較直觀,所以數據調整到了二維,選取100個點繪製,聚類類別為3類
from
sklearn
.
cluster
import
KMeans
from
sklearn
.
externals
import
joblib
from
sklearn
import
cluster
import
numpy
as
np
import
matplotlib
.
pyplot
as
plt
data
=
np
.
random
.
rand
(
100
,
2
)
estimator
=
KMeans
(
n_clusters
=
3
)
res
=
estimator
.
fit_predict
(
data
)
lable_pred
=
estimator
.
labels_
centroids
=
estimator
.
cluster_centers_
inertia
=
estimator
.
inertia_
#print res
lable_pred
centroids
inertia
for
i
in
range
(
len
(
data
))
:
if
int
(
lable_pred
[
i
])
==
0
:
plt
.
scatter
(
data
[
i
][
0
],
data
[
i
][
1
],
color
=
"red"
)
if
int
(
lable_pred
[
i
])
==
1
:
plt
.
scatter
(
data
[
i
][
0
],
data
[
i
][
1
],
color
=
"black"
)
if
int
(
lable_pred
[
i
])
==
2
:
plt
.
scatter
(
data
[
i
][
0
],
data
[
i
][
1
],
color
=
"blue"
)
plt
.
show
()
可以看到聚類效果還是不錯的,對k-means的聚類效率進行了一個測試,將維度擴寬到50維
對於百萬級的數據,擬合時間還是能夠接受的,可見效率還是不錯,對模型的保存與其它的機器學習演算法模型保存類似
from
sklearn
.
externals
import
joblib
joblib
.
dump
(
km
,
"model/km_model.m"
)
看完本文有收穫?請轉發分享給更多人
關注「大數據與機器學習文摘」,成為Top 1%


※選擇一個 Python Web 框架:Django vs Flask vs Pyramid
※PyCharm 2017.2.3 發布,支持 Docker Compose
※數據科學和 ML 領域常用的 Python 庫
TAG:Python開發者 |