1. 程式人生 > >聚類分析 一、k-means

聚類分析 一、k-means

前言

人們常說“物以類聚,人以群分”,在生物學中也對生物從界門綱目科屬種中進行了劃分。在統計學中,也有聚類分析法,通過把相似的物件通過靜態分類的方法分成不同的組別或者更多的子集,從而讓同一個子集中的成員都有相似的一些屬性,然後對這些子集中的資料進行分析,其關鍵則在於聚類。這系列文章將來講講各種聚類方法,這篇開篇文章將介紹下聚類的相關概念以及最基本的演算法 K-Means。

聚類

我們都知道,在機器學習中,一般分為有監督、無監督、半監督學習三類。其中無監督學習常用的方法便是聚類。

將一個數據集分為多類後,每一類又稱為簇,同一簇中的樣本儘可能的相似,而不同簇中的樣本儘可能不同。即具有高類內相似性和低類間相似性的特點。

聚類的方法大致可分為兩種

  • 分割槽(Partitional algorithms)
    • 基於原型:K-Means,GMM等
    • 基於密度:DBACAN,MeanShift等
  • 分層(Hierarchical algorithms)
    • 自頂向下
    • 自底向上

這裡,就不禁產生一個疑問,我們以什麼為標準進行聚類?這也就涉及到了相似度的問題,即我們如何判斷兩個樣本資料是不是相似的?

如果資料特徵只有二維,那我們把資料中的點放置在二維座標系中,如果屬於一類,那這些點肯定是會離得比較近,這個近實際上就是我們的相似度度量標準,即距離。那當特徵維數增加,在超平面中來劃分類,自然也可以通過距離來度量相似性。

常見的距離

  • Minkowski 距離
    • \(D_{mk}(x,z)=(\sum_{i=1}^{n}|x_i-z_i|^p)^{\frac{1}{p}}\)
    • 當 \(p=2\) 時,為歐氏距離 \(D_{ed}(x,z)=||x-z||=\sqrt{\sum_{i=1}^{n}|x_i-z_i|^2}\)
    • 當 \(p=1\) 時,為曼哈頓距離(城市距離) \(D_{man}(x,z)=||x-z||_1=\sum_{i=1}^{n}|x_i-z_i|\)
    • 若 \(p=+\infty\) 時,為 sup 距離 \(D_{sup}=||x-z||_{\infty}=max_{i=1}^{n}|x_i-z_i|\)
  • Hamming 距離
    • 當特徵為二值特徵時,Minkowski 距離又被稱為 Hamming 距離
  • 皮爾森相關係數
    • \(S_p(x,z)=\frac{\sum_{i=1}^{n}(x_i-\bar{x})(z_i-\bar{z})}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2 \times \sum_{i=1}^{n}(z_i-\bar{z})^2}}\)
  • 餘弦距離
    • \(S_c(x,z)=\frac{X^Tz}{||x||||z||}\)

K-Means

演算法流程

K-Means 演算法很好理解,首先需要指定聚類簇的個數 K。隨機設定 K 個聚類中心 \(\mu_1,\mu_2,...,\mu_K \in \mathbb{R}^n\) ,然後不斷迭代更新這些中心點,直到收斂:

  1. for i=1 to m

    計算 \(x^{(i)}\) 距離最近的聚類簇的中心,將其作為 \(x^{(i)}\) 的類別,即 \(y^{(i)}=\arg\min_k{||x^{(i)}-\mu_k||^2}\)

  2. for k=1 to K

    更新聚類簇的中心,用所有屬於第 k 個簇的樣本的均值去更新 \(\mu_k\) ,即 \(\mu_k=avg(x^{(i)}|y^{(i)}=k)\)

從上面的介紹可以看出來, K-Means 的目標函式為
\[ J\left(y^{(1)}, \cdots, y^{(m)}, \mu_{1}, \cdots, \mu_{K}\right)=\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}-\mu_{y^{(i)}}\right\|^{2} \]

K 值選取

之前提到過 K 值是需要自己設定的,那麼,我們要如何才能取到合適的 K 值呢?(之前面試給問到這個問題,當時一時間懵了。。。面試官說是可以算出來的一般選擇在 \(\sqrt{\frac{n}{2}}\) 附近做調整,沒試過真不太清楚)

一般有兩種方式,分別是手肘法輪廓係數法

手肘法

採用指標 SSE(sum of the sqared errors,誤差平方和)
\[ SSE=\sum_{i-1}^{k}\sum_{p\in C_i}|p-\mu_i|^2 \]
其中,\(C_i\) 表示第 i 個簇,p為 \(C_i\) 中的樣本點,\(\mu_i\) 為 \(C_i\) 的質心。

其核心思想是隨著聚類數 k 的增大,樣本劃分不斷精細,SSE 會不斷減小。當 k 小於真實聚類樹時,k 的增大會大幅度增加每個簇的聚合程度,SSE 的下降幅度會驟減,然後隨著 k 值得繼續增大而趨於平緩。

輪廓係數法

該方法的核心指標時輪廓係數(silhouette Coefficient),某個樣本點 \(x_i\) 的輪廓係數定義為
\[ S=\frac{b-a}{max(a,b)} \]
其中,a 是 \(x_i\) 與同簇的其它樣本的平均距離,稱為凝聚度,b 是 \(x_i\) 與最近簇中所有樣本的平均距離,稱為分離度。最近簇的定義為
\[ C_j=\arg\min_{C_k}\frac{1}{n}\sum_{p\in C_k}|p-x_i|^2 \]
其中 p 是某個簇 \(C_k\) 中的樣本。

求出所有樣本的輪廓係數之後再求平均值就得到了平均輪廓係數,一般來說,簇內樣本的距離越近,簇間樣本距離越遠,平均平均輪廓係數越大,效果越好。

程式碼實現

#隨機初始化centroids
def kMeansInitCentroids(X, K):
    """
    隨機初始化centroids
    :param X: 訓練樣本
    :param K: 聚類簇個數
    :return: 初始化的centroids
    """
    np.random.seed(5)
    
    i = np.random.randint(0, len(X), K)
    centroids = X[i, :]
    
    return centroids

def findClosestCentroids(X, centroids):
    """
    尋找每個樣本離之最近的centroid
    :param X: 訓練集
    :param centroids:聚類簇中心
    :return: 索引集
    """
    K = centroids.shape[0]
    m = X.shape[0]
    index = np.zeros((m))
    
    for i in range(m):
        dis = np.sum(np.power(X[i, :] - centroids, 2), axis=1)
        index[i] = np.argmin(dis)
    
    return index

def computeCentroids(X, index, K):
    """
    更新聚類簇中心
    :param X: 訓練集
    :param index: 索引集
    :param K: 聚類簇個數
    :return: 更新的聚類簇中心
    """
    [m, n] = X.shape
    centroids = np.zeros((K, n))
    
    for i in range(K):
        idx = np.where(index==i)
        centroids[i, :] = np.mean(X[idx, :], axis=1)
    
    return centroids

centroids = kMeansInitCentroids(X, K)
l = 10 # 迭代次數
for i in range(l):
    
    #計算索引集index
    index = findClosestCentroids(X, centroids)
    
    #更新centroids
    centroids = computeCentroids(X, index, K)

結果圖

聚類中心移動

相關推薦

分析 k-means

前言 人們常說“物以類聚,人以群分”,在生物學中也對生物從界門綱目科屬種中進行了劃分。在統計學中,也有聚類分析法,通過把相似的物件通過靜態分類的方法分成不同的組別或者更多的子集,從而讓同一個子集中的成員都有相似的一些屬性,然後對這些子集中的資料進行分析,其關鍵則在於聚類。這系列文章將來講講各種聚類方法,這篇開

python 分析實戰案例:K-means演算法(原理原始碼)

K-means演算法: 關於步驟:參考之前的部落格 關於程式碼與資料:暫時整理程式碼如下:後期會附上github地址,上傳原始資料與程式碼完整版, 各種聚類演算法的對比:參考連線 Kme

原型k均值演算法和python實現

原型聚類 原型聚類演算法假設聚類結構能通過一組原型刻畫,在現實聚類任務中極為常用。通常情形下,演算法先對原型進行初始化,然後對原型進行迭代更新求解。這裡的“原型”我認為實際上就是“原來的模型”,這類演算法企圖模擬出生成資料集的模型。 k均值演算法(k-means

劃分方法(二)K-MEANS演算法的改進

   本文將主要針對K-MEANS演算法主要缺點的改進進行講述。 (1)離群點,噪聲點的改進:針對離群點、噪聲點,通過離群點檢測演算法,去掉離群點與噪聲點。資料探勘方面,經常需要在做特徵工程和模型訓

吳恩達機器學習(十K-means(無監督學習演算法)

目錄 0. 前言 學習完吳恩達老師機器學習課程的無監督學習,簡單的做個筆記。文中部分描述屬於個人消化後的理解,僅供參考。 如果這篇文章對你有一點小小的幫助,請給個關注喔~我會非常開心

演算法實踐()——層次K-means

因為百度雲的文章裡面有些圖片丟失了,想起這篇東西之前被一箇中國統計網轉發過,所以自己搜了一下想直接把圖搞回來,結果發現到處轉載的也有不少,自己現在發倒好像是抄襲似的。其實這篇文章裡面特別有價值的東西不算太多,PCCA算是一個知道的人不多而且也挺有意義的演算法,譜

機器學習之分析---K-means

初探k-means(Matlab)俗話說:,聚類分析的目的是:在資料中發現數據物件之間的關係,並將資料進行分組,使得組內的相似性儘可能大,組間的差別盡可能大,那麼聚類的效果越好。例如在市場營銷中,聚類分

數學模型:3.非監督學習--分析K-means

rand tar 聚類分析 復制 clust tle 降維算法 generator pro 1. 聚類分析 聚類分析(cluster analysis)是一組將研究對象分為相對同質的群組(clusters)的統計分析技術 ---->> 將觀測對象的群體按照

分析(二)k-means及matlab程式

1.介紹 k-means是一種常見的基於劃分的聚類演算法。劃分方法的基本思想是:給定一個有N個元組或者記錄的資料集,將資料集依據樣本之間的距離進行迭代分裂,劃分為K個簇,其中每個簇至少包含一條實驗資料。 2.k-means原理分析 2.1工作原理 (1)首先,k-means方法從資料集中隨機

演算法()—— k-means演算法以及其改進演算法

      聚類演算法是一種無監督學習,它把資料分成若干類,同一類中的資料的相似性應儘可能地大,不同類中的資料的差異性應儘可能地大。聚類演算法可分為“軟聚類”和“硬聚類”,對於“硬聚類”,樣本中的每一個點都是 100%確定分到某一個類別;而“軟聚類”是指樣本點以一定的概率被分

使用 Spark MLlib 做 K-means 分析

引言 提起機器學習 (Machine Learning),相信很多計算機從業者都會對這個技術方向感到興奮。然而學習並使用機器學習演算法來處理資料卻是一項複雜的工作,需要充足的知識儲備,如概率論,數理統計,數值逼近,最優化理論等。機器學習旨在使計算機具有人類一樣的學習能力和模仿能力,這也是實現人工

K-means分析-互動式GUI演示(Matlab)

K-means聚類分析-互動式GUI演示(Matlab) 學習K-means的時候總是想,這應該是一個很酷的演算法,那麼酷的演算法,就應該有比較酷的demo來演示它,於是我寫了這個程式就是為了能裝逼,哦不,可以更直觀的和K-means演算法進行互動。原創程式,希望大家可以喜歡,

分析層次k-means演算法

參考文獻: [1]Jure Leskovec,Anand Rajaraman,Jeffrey David Ullman.大資料網際網路大規模資料探勘與分散式處理(第二版) [M]北京:人民郵電出版社,2015.,190-199; [2]蔣盛益,李霞,鄭琪.資料探勘原理與實踐 [M]北京:電子工業出版社,20

分析(K-means 層次和基於密度DBSCAN演算法三種實現方式)

之前也做過聚類,只不過是用經典資料集,這次是拿的實際資料跑的結果,效果還可以,記錄一下實驗過程。 首先: 確保自己資料集是否都完整,不能有空值,最好也不要出現為0的值,會影響聚類的效果。 其次: 想好要用什麼演算法去做,K-means,層次聚類還是基於密

K-meansK-medoids演算法分析

 1    聚類是對物理的或者抽象的物件集合分組的過程,聚類生成的組稱為簇,而簇是資料物件的集合。         (1)簇內部的任意兩個物件之間具有較高的相似度。(2)屬於不同的簇的兩個物件間具有較高的相異度。  2    相異度可以根據描述物件的屬性值來計算,最常用的度

用scikit-learn做分析

線性迴歸和邏輯迴歸都是監督學習方法,聚類分析是非監督學習的一種,可以從一批資料集中探索資訊,比如在社交網路資料中可以識別社群,在一堆菜譜中識別出菜系。本節介紹K-means聚類演算法 K-means k是一個超引數,表示要聚類成多少類。K-means計算方法是重複移

分析之迭代——“K-Means

魯棒是Robust,英 [rə(ʊ)'bʌst]的音譯,也就是健壯、強壯、堅定、粗野的意思。魯棒性(robustness)就是系統的健壯性。常使用如:演算法的魯棒性。 演算法雜貨鋪轉載學習 演算法雜貨鋪——分類演算法之決策樹(Decision tree) 聚類演算法實踐(一)——層次聚類、K-

K-Means例子細節

聚類 今天說聚類,但是必須要先理解聚類和分類的區別,很多業務人員在日常分析時候不是很嚴謹,混為一談,其實二者有本質的區別。 分類其實是從特定的資料中挖掘模式,作出判斷的過程。比如Gmail郵箱裡有垃圾郵件分類器,一開始的時候可能什麼都不過濾,在日常使用過程中,我人工對於每一封郵件點選“垃圾”或“不是垃圾”,過

第11章 K-means(文件分析

載入資料集 已標記好類別的四個文件資料集:(網路安全,電子學,醫學medical,太空) import matplotlib.pyplot as plt import numpy as np from time import time from sklearn.datasets

使用Orange進行資料探勘之分析(2)------K-means

一、基本k均值演算法 1 根據使用者指定的引數K,首先選擇K個初始化質心; 2 然後每個點指派到最近的質心,指派到一個質心的點形成一個簇。 3 更新每個簇的質心 4重複步驟2、3,直到簇不在發生變化。 虛擬碼描述如下: 選擇K個點作為初始質心 repeat 將每個質