【無監督學習】2:DBSCAN聚類演算法原理

zzZ_CMing發表於2018-04-09

前言:無監督學習想快一點複習完,就轉入有監督學習
-----------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------
聚類演算法主要包括哪些演算法?

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

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

什麼是無監督學習?

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

-----------------------------------------------------------------------------------------------------------------------------------------

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

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

-----------------------------------------------------------------------------------------------------------------------------------------

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

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

-----------------------------------------------------------------------------------------------------------------------------------------

一、DBSCAN聚類

定義:DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種基於密度的空間聚類演算法。該演算法將具有足夠密度的區域劃分為簇,並在具有噪聲的空間資料庫中發現任意形狀的簇,DBSCAN演算法將“簇”定義為密度相連的點的最大集合
1、傳統的密度定義:基於中心的方法

傳統的密度定義方法——事先給定半徑r,資料集中點a的密度,要通過落入以點a為中心以r為半徑的圓內點的計數(包括點a本身)來估計。很顯然,密度是依賴於半徑的。如下圖所示:
這裡寫圖片描述
2、DBSCAN中依照密度,對樣本點的劃分

基於以上密度的定義,我們可以將樣本集中的點劃分為以下三類:

  • 核心點:在半徑r區域內,含有超過MinPts數目(最小數目)的點,稱為核心點;
  • 邊界點:在半徑r區域內,點的數量小於MinPts數目,但是是核心點的直接鄰居;
  • 噪聲點:既不是核心點也不是邊界點的點

下圖可以很清楚的區分三種點:
這裡寫圖片描述
依照上圖以及三種點的定義,可以得到:噪聲點是不會被聚類納入的點,邊界點與核心點組成聚類的“簇”。
3、介紹三個有趣的概念

  • 直接密度可達:在給定一個物件集合D,如果p在q的r領域內,且q是一個核心點物件,則稱物件p從物件q出發時是直接密度可達的
  • 密度可達:在給定物件集合D中,如果存在一個物件鏈q–>e–>a–>k–>l–>p,任意相鄰兩個物件間都是直接密度可達的,則稱物件p是物件q關於r鄰域內、MinPts數目下,是密度可達的;
  • 密度相連:如果在物件集合D中存在一個物件O,使得物件p和q都是從O關於r鄰域內、MinPts數目下,是密度相連的。

如下圖所示:r用一個相應的半徑表示,設MinPts=3,分析Q、M、P、S、O、R這5個樣本點之間的關係。
這裡寫圖片描述
根據以上概念可知:由於有標記的各點M、P、O和R的r鄰域均包含3個以上的點,因此它們都是核物件;M是從P的“直接密度可達”;Q是從M的“直接密度可達”;基於上述結果,Q是從P的“密度可達”;但P從Q是無法“密度可達”(非對稱的);類似的,S和R都是從O的“密度可達”;O、R都是從S的“密度相連”。

也就是說:核心點能夠連通(密度可達),它們構成的以r為半徑的圓形鄰域相互連線或重疊,這些連通的核心點及其所處的鄰域內的全部點構成一個簇。

4、DBSCAN聚類演算法原理

  1. DBSCAN通過檢查資料集中每個點的r鄰域來搜尋簇,如果點p的r鄰域包含多於MinPts個點,則建立一個以p為核心物件的簇;
  2. 然後, DBSCAN迭代的聚集從這些核心物件直接密度可達的物件,這個過程可能涉及一些密度可達簇的合併;
  3. 當沒有新的帶你新增到任何簇時,迭代過程結束。

DBSCAN聚類演算法效果展示如下圖:
這裡寫圖片描述

5、DBSCAN聚類演算法優缺點

優點:基於密度定義,可以對抗噪聲,能處理任意形狀和大小的簇

缺點:當簇的密度變化太大時候,聚類得到的結果會不理想;對於高維問題,密度定義也是一個比較麻煩的問題。

6、DBSCAN聚類演算法

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

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

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

X1, y1 = datasets.make_circles(n_samples=5000, factor=.6,
                                      noise=.05)
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2,
                             centers=[[1.2,1.2]], cluster_std=[[.1]],random_state=9)

# 原始點的分佈
ax1 = fig.add_subplot(311)
X = np.concatenate((X1, X2))
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.title(u'原始資料分佈')
plt.sca(ax1)

"""
# K-means聚類
from sklearn.cluster import KMeans
ax2 = fig.add_subplot(312)
y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title(u'K-means聚類')
plt.sca(ax2)
"""

# DBSCAN聚類
from sklearn.cluster import DBSCAN
ax3 = fig.add_subplot(313)
y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title(u'DBSCAN聚類')
plt.sca(ax3)

plt.show()

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

系列推薦:

【監督學習】1:KNN演算法實現手寫數字識別的三種方法
-----------------------------------------------------------------------------------------------------------------------------------------
【無監督學習】1:K-means演算法原理介紹,以及程式碼實現
【無監督學習】2:DBSCAN演算法原理介紹,以及程式碼實現
【無監督學習】3:Density Peaks聚類演算法(區域性密度聚類)
-----------------------------------------------------------------------------------------------------------------------------------------
【深度學習】1:感知器原理,以及多層感知器解決異或問題
【深度學習】2:BP神經網路的原理,以及異或問題的解決
【深度學習】3:BP神經網路識別MNIST資料集
【深度學習】4:BP神經網路+sklearn實現數字識別
【深度學習】5:CNN卷積神經網路原理、MNIST資料集識別
【深度學習】8:CNN卷積神經網路識別sklearn資料集(附原始碼)
【深度學習】6:RNN遞迴神經網路原理、MNIST資料集識別
【深度學習】7:Hopfield神經網路(DHNN)原理介紹
-----------------------------------------------------------------------------------------------------------------------------------------
TensorFlow框架簡單介紹
-----------------------------------------------------------------------------------------------------------------------------------------

相關文章