一、聚類演算法簡介

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

()

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

# 機器學習: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

()

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

三、 K-Means演算法小結

優點:(

簡單快速適合常規資料集

​原理簡單(靠近中心點),實現容易

​聚類效果中上(依賴K的選擇)

空間複雜度o(N),時間複雜度o(I

K

N)

缺點:

​ K值不確定(嘗試不同的K值才知道那個值最好)

複雜度和樣本呈線性關係

很難發現任意形狀的簇

如任意形狀的簇(看到這個圖形,會不會想到案例3的支援向量機?)

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

【注意】:當K值合適時,由於K-Means演算法原理,初始化的K個質心是隨意取值,可能會出現意外結果,這是演算法本身的特點導致的。(大家可以使用上面推薦的網站進行嘗試)例如:

預期效果:

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

實際效果:

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

四、案例:使用K-Means對不同品牌啤酒聚類分析

import

pandas

as

pd

beer

=

pd

read_csv

“。/data。txt”

sep

=

“ ”

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

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

print

“當k=2時聚類結果:”

km2

labels_

print

“當k=3時聚類結果:”

km3

labels_

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

# 圖形化展示聚類效果(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”

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

scatter_matrix

beer

[[

“calories”

“sodium”

“alcohol”

“cost”

]],

s

=

100

alpha

=

1

c

=

colors

beer

“cluster3”

]],

figsize

=

10

10

))

plt

suptitle

“With 3 centroids initialized”

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

附案例程式碼:

拓展:DBSCAN聚類算反

一、DBSCAN演算法簡介

1。1 引入

前面一篇文章(案例4)介紹了使用K-Means聚類演算法進行資料分類,那麼任意形狀的簇如何分類呢?

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

很明顯使用K-Means很難對上面的圖形進行分類,而使用DBSCAN演算法卻有很好的效果。

1。2 演算法原理

案例4:機器學習--使用k-means對不同品牌啤酒進行聚類分析

基本概念:

核心物件

:若某個點的密度達到演算法設定的閾值則其為核心點。(即 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中效率低(資料削減策略)

二、程式碼實現

詳細請參考:

待更新。。。