1. 程式人生 > >sklearn中聚類(部分)

sklearn中聚類(部分)

下圖為主要介紹的幾個聚類方法:

1、 k均值(K-means

在指定n個類別後,最小化類別中樣本到類別均值樣本的距離,公式如下:


其中,Ci為劃分,ui為每個劃分的均值向量,k=nK-均值是相當於一個小、全等、對角協方差矩陣的期望最大化演算法。

該方法有以下缺點:

  • 有個前提:叢集是凸和各向同性的。對長條形、流行以及不規則形的叢集響應不好。
  • 慣性不是歸一化的度量:僅僅知道值越低越好。但是在高維空間中,歐幾里得距離會有所變化。因此在使用k均值方法前,可以利用PCA演算法對資料降維,不僅可緩解這一問題,而且還可以加快計算。

▲k均值的演算法如下:(參考周志華老師的《機器學習》:203

***********************************************************

輸入:樣本集D={x1x2x3xm}

聚類簇數:k

過程:

D中隨機選擇k個樣本{u1u2u3uk}

              repeat

Ci={}1<=i<=k

計算每個樣本到{u1u2u3uk}的距離,將距離最近的加入對應的集合中

計算對應集合的均值向量

更新隨機選擇的k個樣本

             until 當前均值樣本向量均未更新

輸出:劃分

***********************************************************

理論上k-均值總會收斂(可能收斂於一個區域性最小值),這依賴於初始化的質心。因此k-均值演算法常常會以不同初始化的質心計算幾次。在sklearn中可設定init=kmeans++解決這一問題。

▲n_jobs引數可以實現並行處理。通常需要計算機有多的處理器,當n_jobs=-1時,表示使用全部的處理器,-2時減少一個,以此類推。處理器使用的越多記憶體消耗越大。

下面的例子為:k均值演算法在不同資料集上的表現,其中前三個為輸入資料不符合前提假設,最後一個為每個叢集大小不應的情況。如下圖:


相關程式碼如下:

  1. # -*- coding: utf-8 -*-
  2. """ 
  3. Created on Wed Feb  8 14:15:41 2017
     
  4. @author: ZQ 
  5. """
  6. import numpy as np  
  7. import matplotlib.pyplot as plt  
  8. from sklearn.cluster import KMeans  
  9. from sklearn.datasets import make_blobs  
  10. plt.figure(figsize=(12,12))  
  11. n_samples = 1500
  12. random_state = 170
  13. X,y = make_blobs(n_samples=n_samples,random_state=random_state)  
  14. #第一幅圖,不正確的聚類引數
  15. y_pred = KMeans(n_clusters=2,random_state=random_state).fit_predict(X)  
  16. plt.subplot(221)  
  17. plt.scatter(X[:,0],X[:,1],c=y_pred)  
  18. plt.title("Incorrect Number of Blobs")  
  19. #各向異性資料
  20. transformation = [[0.60834549,-0.63667341],[-0.40887718,0.85253229]]  
  21. X_aniso = np.dot(X,transformation)  
  22. y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X_aniso)  
  23. plt.subplot(222)  
  24. plt.scatter(X_aniso[:,0],X_aniso[:,1],c=y_pred)  
  25. plt.title("Anisotropicly Distributed Blobs")  
  26. #不同方差
  27. X_varied,y_varied = make_blobs(n_samples=n_samples,  
  28.                                cluster_std=[1.0,2.5,0.5],  
  29.                                random_state=random_state)  
  30. y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X_varied)  
  31. plt.subplot(223)  
  32. plt.scatter(X_varied[:,0],X_varied[:,1],c=y_pred)  
  33. plt.title("Unequal Variance")  
  34. #不同大小的聚類,選取標籤為0的500個。。。。
  35. X_filtered = np.vstack((X[y==0][:500],X[y==1][:100],X[y==2][:10]))  
  36. y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X_filtered)  
  37. plt.subplot(224)  
  38. plt.scatter(X_filtered[:,0],X_filtered[:,1],c=y_pred)  
  39. plt.title("Unevenly Sized Blobs")  
  40. plt.show()  

1.1、Mini Batch K-Means

MiniBatchKMeansk均值演算法的變種,可減少收斂時間,但是其結果與標準的k均值演算法較差。每次迭代中選取的資料集為原始資料集的子集。

該演算法主要分為兩步:

  • 在原始資料集中選取b個樣本作為小批量,並將其分配到最近的質心(質心的選取不太清楚,有兩種可能,1隨機在樣本集中選取,2在小批量中選取。不清楚)
  • 更新質心

雖然說MiniBatchKmeans不如標準的K均值演算法,但是其差異很小,如下例子:相關程式碼可查詢http://scikit-learn.org/stable/auto_examples/cluster/plot_mini_batch_kmeans.html

2、 層次聚類(Hierarchical clustering

該聚類演算法試圖在不同層次對資料集進行劃分,從而形成樹形的聚類結構。劃分方法可採用自上而下和自下而上的方法。


AgglomerativeClustering採用自下而上的方法。首先將每個樣本作為一個類,然後按照距離度量的方法將其合併到需要的聚類數。根據距離度量方法可分為:Ward方差和最小(距離最小)、complete聚類中最大或最小距離、average平均距離。

下面的例子說明了這三個方法的優缺點,該聚類方法具有一定的富集性,選擇其中的average較好。如下圖:http://scikit-learn.org/stable/auto_examples/cluster/plot_digits_linkage.html


3、DBSCAN

該演算法通過樣本的緊密程度來確定樣本的分佈,該演算法可適用於叢集在任何形狀的情況下。DBSCAN演算法中一個重要的概念為核心樣本(具有較高的緊密度)。該演算法有兩個引數min_sampleseps,高min_samples或者低eps代表著在形成聚類時,需要較高的緊密度。

該演算法簡單的描述:先任意選擇資料集中的一個核心物件為種子,在由此出發確定相應的聚類簇,在根據給定的領域引數(min_sampleseps)找出所有核心物件,在以任意一個核心物件出發,找出由其密度可達的樣本生產聚類簇,直到所有核心物件均被訪問為止。(更多參考周志華老師《機器學習》P212

下圖為一個例子:使用DBSCAN演算法,大圈為找到了核心樣本,帶顏色的小點位非核心樣本,黑色的為異常值。


  1. 相關程式碼:  
  2. # -*- coding: utf-8 -*-
  3. """ 
  4. Created on Sun Feb 12 10:49:05 2017 
  5. @author: ZQ 
  6. """
  7. import numpy as np  
  8. import matplotlib.pyplot as plt  
  9. from sklearn.cluster import DBSCAN  
  10. from sklearn import metrics  
  11. from sklearn.datasets.samples_generator import make_blobs  
  12. from sklearn.preprocessing import StandardScaler  
  13. #生產資料
  14. centers = [[1,1],[-1,-1],[1,-1]]  
  15. X,labels_true = make_blobs(n_samples=750,  
  16.                            centers=centers,  
  17.                            cluster_std=0.4,  
  18.                            random_state=0)  
  19. #對資料進行標準化
  20. X = StandardScaler().fit_transform(X)  
  21. #計算
  22. db = DBSCAN(eps=0.3,min_samples=10).fit(X)  
  23. core_samples_mask = np.zeros_like(db.labels_,dtype=bool)  
  24. core_samples_mask[db.core_sample_indices_] = True
  25. labels = db.labels_  
  26. n_clusters_ = len(set(labels))-(1if -1in labels else0)  
  27. unique_labels = set(labels)  
  28. colors = plt.cm.Spectral(np.linspace(0,1,len(unique_labels)))  
  29. for k,col in zip(unique_labels,colors):  
  30.     if k == -1:  
  31.         col = 'k'
  32.     class_member_mask = (labels == k)  
  33.     xy = X[class_member_mask & core_samples_mask]  
  34.     plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,  
  35.              markeredgecolor='k', markersize=14)  
  36.     xy = X[class_member_mask & ~core_samples_mask]  
  37.     plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,  
  38.              markeredgecolor='k', markersize=6)  
  39. plt.title('Estimated number of clusters: %d' % n_clusters_)  
  40. plt.show()  

補充:用聚類進行影象分割


相關推薦

sklearn部分

下圖為主要介紹的幾個聚類方法: 1、 k均值(K-means) ▲在指定n個類別後,最小化類別中樣本到類別均值樣本的距離,公式如下: 其中,Ci為劃分,ui為每個劃分的均值向量,k=n。K-均值是相當於一個小、全等、對角協方差矩陣的期望最大化演算法。 ▲該方法

使用Python進行層次——scipy層次的自定義距離度量問題

今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量 層次聚類上次已經總結過。 這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。 我們進入該函式的文件頁面我們看到linkage的說明文件上面的函式scipy.cluster.hiera

HCM和模糊FCM在彩色影象分割的具體應用

      示例工程見:       一年前我寫過模糊聚類演算法(FCM)和硬聚類演算法(HCM)的VB6.0實現及其應用  一文,之後,有不少同仁向我詢問如何將這個演算法應用在彩色影象的分割上,鑑於影象資料的特殊性,這裡簡單的談談在影象中聚類演算法的需要注意一些細節。           C均值

基於Kmeans演算法實現客戶價值分析系統(電信運營商)

開發環境 jupyter notebook 一、電信運營商–客戶價值分析 從客戶需求出發,瞭解客戶需要什麼,他們有怎麼樣的特徵, 電信運營商為客戶設定不同的優惠套餐 爭取更多的使用者:推出不同的優

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

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

原型學習向量量化LVQ和python實現

學習向量量化(Learning Vector Quantization,LVQ)和k-means類似,也屬於原型聚類的一種演算法,不同的是,LVQ處理的是有標籤的樣本集,學習過程利用樣本的標籤進行輔助聚類,個人感覺這個演算法更像是一個分類演算法。。。 若存在一個

機器學習之

在機器學習和資料探勘中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是資料分析中的相關分析,資料探勘中的分類和聚類演算法,如 K 最近鄰(KNN)和 K 均值(K-Means)等等。根據資料特性的不同,可以採用不同的度量方法

scipy做層級

#!/usr/bin/python3 # -*- coding: utf-8 -*- ###cluster.py #匯入相應的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,k

劃分方法 Canopy+K-MEANS 演算法解析

       前面的博文已經系統的講述了K-MEANS演算法以及由K-MEANS演算法改進而來的一系列演算法。在這裡我們將Canopy與K-MEANS聯絡起來。 首先講一下前面提到的Canopy演算法

使用Python進行層次——層次簇間自然分割方法和評價方法

簇間自然分割方法 今天,主要研究一下層次聚類在進行資料運算的時候,對資料結果進行自然簇分離而需要分析的API————inconsistent()。該函式是計算層次聚類不一致係數的,不一致係數越大,表明使用該閾值進行聚類的偏差越大。這樣按照該不一致係數下的閾值進

密度DBSCAN

DBSCAN 基本概念與演算法原理 有資料集D={x1,x2,...,xm}, 引數param={ϵ,MinPts} 有如下基本概念: ϵ-鄰域:資料集D中除xi外的其他樣本與xi距離小於ϵ的樣本集合。記作Nϵ(xj)={xj∈D|dist(xi,

呼叫WEKA包進行kmeansjava

所用資料檔案:data1.txt @RELATION data1 @ATTRIBUTE one REAL @ATTRIBUTE two REAL @DATA 0.184000 0.482000 0.152000 0.540000 0.152000 0.5960

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

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

1.原型聚類 原型聚類亦稱“基於原型的聚類”(prototype-based clustering),此類演算法假設聚類結構能通過一組原型刻畫,在現實聚類任務中常用。通常,演算法先對原型進行初始化,然後對原型進行迭代更新求解。 1)K-Means演算法 (

weka文字3--文字轉換成arff

    要使用weka進行聚類分析,必須先將文字資料轉換成weka可識別的arff格式。Instances類是weka可識別的資料類,其toString方法即可轉換為arff格式的資料。在文字聚類中,arff格式的示例如下: @relation patent @attrib

使用Python進行層次——基本使用+主成分分析繪圖觀察結果+繪製熱圖

Python常用資料探勘的工具包 python對於資料處理非常有好的語言,比如常用的scikit-learn和scipy都可以用來進行機器學習和資料探勘。同時為了使得結果視覺化,Python還提供了非常好用的視覺化工具包matplotlib和seaborn。

[硬貨]|《機器學習》筆記-9

作者: 劉才權 編輯: 黃俊嘉 寫在最前面 如今機器學習和深度學習如此火熱,相信很多像我一樣的普通程式猿或者還在大學校園中的同學,一定也想參與其中。不管是出於好奇,還是自身充電,跟上潮流,我覺得都值得試一試。對於自己,經歷了一段時間的系統學習(參考

機器學習——clustering:K-means演算法非監督學習

1、歸類 聚類(clustering):屬於非監督學習(unsupervised learning),是無類別標記(class label) 2、舉例 3、K-means演算法 (1)K-means演算法是聚類(clustering)中的經典演算法,資料探勘的十大經典演算

Clustering

array label class red 平方和 rom width 好的 clas 簡介 相對於決策樹、樸素貝葉斯、SVM等有監督學習,聚類算法屬於無監督學習。 有監督學習通常根據數據集的標簽進行分類,而無監督學習中,數據集並沒有相應的標簽,算法僅根據數據集

資料個數的確定Determining the number of clusters in a data set

本文主要討論聚類中聚類個數的確定問題。 1. K的作用 Intuitively then, the optimal choice of k will strike a balance between maximum compression of the data using a single clu