案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析
一、聚類演算法簡介
1。1 聚類演算法的概念
一種典型的
無監督
學習演算法,主要用於將相似的樣本自動歸到一個類別中。
在聚類演算法中根據樣本之間的相似性,將樣本劃分到不同的類別中,對於不同的相似度計算方法,會得到不同的聚類結果,常用的相似度計算方法有
歐式距離法
。
1。2 聚類演算法在現實中的應用
使用者畫像,廣告推薦,Data Segmentation,搜尋引擎的流量推薦,惡意流量識別
基於位置資訊的商業推送,新聞聚類,篩選排序
影象分割,降維,識別;離群點檢測;信用卡異常消費;發掘相同功能的基因片段
聚類演算法是無監督的學習演算法,而分類演算法屬於監督的學習演算法。本文主要介紹聚類演算法中的k-means演算法
二、k-means演算法介紹
2。1 聚類流程分析
事先
確定常數K
,常數K意味著最終的聚類類別數;
首先隨機
選定初始點為質心
,並透過計算每一個樣本與質心之間的相似度(這裡為歐式距離),將樣本點歸到最相似的類中,
接著,
重新計算
每個類的質心(即為類中心),重複這樣的過程,直到
質心不再改變
,
最終就確定了每個樣本所屬的類別以及每個類的質心。
2。2 流程體驗
以下連結是動態實現k-means的影象化展示網站,只需要滑鼠點點點,即可感受其聚類流程!
2。3 API使用
sklearn。cluster。KMeans(n_clusters=8)
引數:
n_clusters:開始的聚類中心數量
整型,預設值=8,生成的聚類數,即產生的質心(centroids)數。
方法:
estimator。fit(x)
estimator。predict(x)
estimator。fit_predict(x)
計算聚類中心並預測每個樣本屬於哪個類別,相當於先呼叫fit(x),然後再呼叫predict(x
2。4 聚類效果展示
需求分析:隨機建立不同二維資料集作為訓練集,使用k-means進行聚類展示。
# 建立資料集
import
matplotlib。pyplot
as
plt
from
sklearn。datasets。samples_generator
import
make_blobs
from
sklearn。cluster
import
KMeans
# 資料集描述
# x為特徵,y為類別。一共1000個樣本,4蔟
# 蔟的中心點設定為[-1, -1] [0, 0] [1, 1] [2, 2]
X
,
y
=
make_blobs
(
n_samples
=
1000
,
n_features
=
2
,
centers
=
[[
-
1
,
-
1
],[
0
,
0
],[
1
,
1
],[
2
,
2
]],
cluster_std
=
[
0。3
,
0。4
,
0。2
,
0。2
],
random_state
=
22
)
# cluster_std:設定的每一簇資料的標準差
# 資料視覺化
plt
。
scatter
(
X
[:,
0
],
X
[:,
1
],
marker
=
“o”
)
# 取樣本的前兩個特徵
plt
。
show
()
# 機器學習:k-means聚類
y_pred
=
KMeans
(
n_clusters
=
4
,
random_state
=
22
,)
。
fit_predict
(
X
)
# 此處k值為4,即分為兩類
# 可以嘗試將n_clusters設定不同的值,檢視分類效果
plt
。
scatter
(
X
[:,
0
],
X
[:,
1
],
c
=
y_pred
)
plt
。
show
()
三、 K-Means演算法小結
優點:(
簡單快速適合常規資料集
)
原理簡單(靠近中心點),實現容易
聚類效果中上(依賴K的選擇)
空間複雜度o(N),時間複雜度o(I
K
N)
缺點:
K值不確定(嘗試不同的K值才知道那個值最好)
複雜度和樣本呈線性關係
很難發現任意形狀的簇
如任意形狀的簇(看到這個圖形,會不會想到案例3的支援向量機?)
【注意】:當K值合適時,由於K-Means演算法原理,初始化的K個質心是隨意取值,可能會出現意外結果,這是演算法本身的特點導致的。(大家可以使用上面推薦的網站進行嘗試)例如:
預期效果:
實際效果:
四、案例:使用K-Means對不同品牌啤酒聚類分析
import
pandas
as
pd
beer
=
pd
。
read_csv
(
“。/data。txt”
,
sep
=
“ ”
)
X
=
beer
[[
“calories”
,
“sodium”
,
“alcohol”
,
“cost”
]]
# 機器學習(K-Means聚類)
km2
=
KMeans
(
n_clusters
=
2
)
。
fit
(
X
)
# 取值k=2
km3
=
KMeans
(
n_clusters
=
3
)
。
fit
(
X
)
# 取值k=3
(
“當k=2時聚類結果:”
,
km2
。
labels_
)
(
“當k=3時聚類結果:”
,
km3
。
labels_
)
# 圖形化展示聚類效果(k=3)
from
pandas。tools。plotting
import
scatter_matrix
import
matplotlib。pyplot
as
plt
import
numpy
as
np
plt
。
rcParams
[
‘font。size’
]
=
14
colors
=
np
。
array
([
‘red’
,
‘green’
,
‘blue’
,
‘yellow’
])
plt
。
scatter
(
beer
[
“calories”
],
beer
[
“alcohol”
],
c
=
colors
[
beer
[
“cluster3”
]])
plt
。
scatter
(
centers
。
calories
,
centers
。
alcohol
,
linewidths
=
3
,
marker
=
‘+’
,
s
=
300
,
c
=
‘black’
)
plt
。
xlabel
(
“Calories”
)
plt
。
ylabel
(
“Alcohol”
)
scatter_matrix
(
beer
[[
“calories”
,
“sodium”
,
“alcohol”
,
“cost”
]],
s
=
100
,
alpha
=
1
,
c
=
colors
[
beer
[
“cluster3”
]],
figsize
=
(
10
,
10
))
plt
。
suptitle
(
“With 3 centroids initialized”
)
附案例程式碼:
拓展:DBSCAN聚類算反
一、DBSCAN演算法簡介
1。1 引入
前面一篇文章(案例4)介紹了使用K-Means聚類演算法進行資料分類,那麼任意形狀的簇如何分類呢?
很明顯使用K-Means很難對上面的圖形進行分類,而使用DBSCAN演算法卻有很好的效果。
1。2 演算法原理
基本概念:
核心物件
:若某個點的密度達到演算法設定的閾值則其為核心點。(即 r 鄰域內點的數量不小於 minPts)
ϵ-鄰域的距離閾值
:設定的半徑r
直接密度可達
:若某點p在點q的 r 鄰域內,且q是核心點則p-q直接密度可達。
密度可達
:若有一個點的序列q0、 q1、 …qk,對任意qi-qi-1是直接密度可達的,則稱從q到qk密度可達,這實際上是直接密度可達的“傳播”。
密度相連
:若從某核心點p出發,點q和點k都是密度可達的,則稱點q和點k是密度相連的。
邊界點
:屬於某一個類的非核心點,不能發展下線了
直接密度可達
:若某點p在點q的 r 鄰域內,且q是核心點則p-q直接密度可達。
噪聲點
:不屬於任何一個類簇的點,從任何一個核心點出發都是密度不可達的
1。3 演算法小結
優勢:
不需要指定簇的個數
可以發現任意形狀的簇
擅長找到離群點
只需要兩個引數
劣勢:
處理高維資料有些困難(可以做降維)
引數難以選擇(引數對結果的影響非常大)
Sklearn中效率低(資料削減策略)
二、程式碼實現
詳細請參考:
待更新。。。