1. 程式人生 > >【無監督學習】1:K-means聚類演算法原理

【無監督學習】1:K-means聚類演算法原理

前言:粗略研究完神經網路基礎——BP、CNN、RNN、LSTM網路後自己算是鬆懈了很多,好長的時間都沒有堅持再更新部落格了。“腐敗”生活了這麼久,還是要找到自己一點樂趣吧,於是想了一想,決定把《機器學習》的演算法研究過得都重新梳理一遍,於是就從無監督學習——聚類開始了
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

聚類演算法主要包括哪些演算法?

主要包括:K-means、DBSCAN、Density Peaks聚類(區域性密度聚類)、層次聚類、譜聚類。

若按照聚類的方式可劃分成三類:第一類是類似於K-means、DBSCAN、Density Peaks聚類(區域性密度聚類)的依據密度的聚類方式;
第二種是類似於層次聚類的依據樹狀結構的聚類方式;
第三種是類似於譜聚類的依據圖譜結構的聚類方式。

什麼是無監督學習?

  • 無監督學習也是相對於有監督學習來說的,因為現實中遇到的大部分資料都是未標記的樣本,要想通過有監督的學習就需要事先人為標註好樣本標籤,這個成本消耗、過程用時都很巨大,所以無監督學習就是使用無標籤的樣本找尋資料規律的一種方法
  • 聚類演算法就歸屬於機器學習領域下的無監督學習方法。

—-—-—-—-—-—-—-—-—-—-—-

—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

無監督學習的目的是什麼呢?

  • 可以從龐大的樣本集合中選出一些具有代表性的樣本子集加以標註,再用於有監督學習
  • 可以從無類別資訊情況下,尋找表達樣本集具有的特徵

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

分類和聚類的區別是什麼呢?

  • 對於分類來說,在給定一個數據集,我們是事先已知這個資料集是有多少個種類的。比如一個班級要進行性別分類,我們就下意識清楚分為“男生”、“女生”兩個類;該班又轉入一個同學A,“男ta”就被分入“男生”類;
  • 而對於聚類來說,給定一個數據集,我們初始並不知道這個資料集包含多少類,我們需要做的就是將該資料集依照某個“指標”,將相似指標的資料歸納在一起,形成不同的類;
  • 分類是一個後續的過程,已知標籤資料,再將測試樣本分入同標籤資料集中;聚類是不知道標籤,將“相似指標”的資料強行“擼”在一起,形成各個類。

—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

一、K-means聚類演算法

1.1、K-means 演算法思想、演算法描述

  • K——指我們最後聚成的有K個類;means——平均,指我們在做聚類時選用類間平均距離進行計算
  • K-means 的演算法思想:是通過迭代過程把資料集劃分為不同的類別,使得評價聚類效能的準則函式達到最優,從而使生成的每個類做到——類內緊湊,類間獨立。
  • K-means 的演算法描述如下圖:
    這裡寫圖片描述

1.2、K-means 演算法執行圖示

這裡寫圖片描述

  • (a)圖:展示出樣本集空間中各個資料點的分佈情況;
  • (b)圖:給定了兩個中心點:紅叉叉點、藍叉叉點;
  • (c)圖:樣本集中的資料點,離哪個中心點近,就把資料點分屬到哪個類別中;
  • (d)圖:在分屬好的類別中依照類內距離的平均值,得到新的中心點——原有中心點就從(c)圖中的位置轉移到新的中心點位置;
  • (e)圖:在得到新的中心點後,再依據離哪個中心點近,就把資料點分屬到哪個類別中的方法,重新劃分聚類;直到成(f)圖,中心點不再變化,聚類結束。

1.3、舉例項使用K-means演算法進行聚類

舉個栗子:我們有五個樣本點a(0,2)、b(0,0)、c(1.5,0)、d(5,0)、e(5,2),選取前兩個樣本點a(0,2)、b(0,0)作為初始聚類中心點A、B,開始聚類:

  1. 對於點c(1.5,0),到a點的(歐式)距離為2.5,到b點距離為1.5,所以c點分配給B類;
  2. 同例,d點分入B類、e點分入A類;於是更新後得到的新簇:A類={a,e},B類={b,c,d}
  3. 每迭代一次都計算一次平均誤差:平均誤差是等於新簇內的點到原有中心點距離的平方和,例如:這裡寫圖片描述這裡寫圖片描述
    再得到總體的平均誤差E=25+27.25=52.25
  4. 重新計算新的簇內中心點:A=((0+5)/2,(2+2)/2)=(2.5,2)、B=((0+1.5+5)/3,(0+0+0)/3)=(2.17,0),重複1、2、3步驟,再得到新的平均誤差E=25.62,誤差顯著減小。由於經過兩次迭代後,中心點不再變化,所以停止迭代,聚類結束。

1.4、K-means 演算法優缺點

  • 優點:如果樣本集是團簇密集狀的,K-means聚類方法效果較好
  • 缺點:
    • 對於條狀、環形狀等非團簇狀的樣本集,聚類效果一般;
    • 對於事先給定的K值、初始點敏感,不同K值、初始點可能導致聚類得到結果差異較大;
    • 也可能因為初始點分屬同一類,導致最後結果陷入區域性最小值,無法達到全域性最優解。

1.5、K值的選取原則——肘部法則

由於K-means 演算法對初選的K值是敏感的,計算平均誤差就是為了K值的選取,請看下圖:
這裡寫圖片描述

平均誤差會隨K值的選取而改變,隨著K值增大,平均誤差會逐漸降低;極限情況下是每個樣本點是都是一個類,這時的平均誤差E=0,當然這種聚類沒有研究的價值。

那麼哪個K值是最佳選取的值呢——肘部法則,就是選取斜率變化較大的拐點處定為K值點,這只是一種簡單的選取規則,方便簡單而且實用。

1.6、K-means聚類程式展示

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/04/10;14:44
# -*- python3.5

import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import KMeans

# 隨機生成資料
points_number = 3000
centers = 20
data,laber=ds.make_blobs(points_number,centers=centers,random_state=0)

# 建立Figure
fig = plt.figure()
# 用來正常顯示中文標籤
matplotlib.rcParams['font.sans-serif'] = [u'SimHei']
# 用來正常顯示負號
matplotlib.rcParams['axes.unicode_minus'] = False

# 原始點的分佈
ax1 = fig.add_subplot(211)
plt.scatter(data[:,0],data[:,1],c=laber)
plt.title(u'原始資料分佈')
plt.sca(ax1)

# K-means聚類後
N = 5
model = KMeans(n_clusters = N,init = 'k-means++')
y_pre = model.fit_predict(data)
ax2 = fig.add_subplot(212)
plt.scatter(data[:,0],data[:,1],c=y_pre)
plt.title(u'K-Means聚類')
plt.sca(ax2)

plt.show()

效果展示:
這裡寫圖片描述
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

系列推薦: