有規模限制的聚類算法


背景介紹:

機器學習的聚類算法在很多場景中都有應用,比如用戶群體的聚類,地址聚類等。但是,在實際問題中,我們的聚類問題常常是有類的規模限制的,比如我們需要創建幾個等大的類,或者有最小類大小的限制等。

 

Github地址:

 https://github.com/jingw2/size_constrained_clustering

PyPI地址:

 https://pypi.org/project/size-constrained-clustering/  

 

方法介紹

  • Fuzzy C-means Algorithm: 和KMeans類似,不過利用了歸屬概率(membership probability)進行計算,而不是直接的0或者1
  • Same Size Contrained KMeans Heuristics: 利用啟發式的方法獲取等大聚類結果
  • Same Size Contrained KMeans Inspired by Minimum Cost Flow Problem:將聚類轉換為分配問題,並用最小費用流的思路進行求解
  • Minimum and Maximum Size Constrained KMeans Inspired by Minimum Cost Flow Problem:將聚類轉換為分配問題,並用最小費用流的思路進行求解,加入最小和最大聚類規模限制
  • Deterministic Annealling Algorithm: 輸入目標每類規模比例,獲得相應聚類規模的結果。
  • Shrinkage Clustering: base algorithm and minimum size constraints:啟發式縮減的方式獲得聚類結果。

且支持聚類距離函數定義callback。由於現實問題,我們常常涉及的不是歐氏距離,而是經緯度距離等,因此本輪子支持自定義函數輸入。

例子展示

初始化

# setup
from size_constrained_clustering import fcm, equal, minmax, shrinkage
# 默認都是歐式距離計算,可接受其它distance函數,比如haversine
from sklearn.metrics.pairwise import haversine_distances

Fuzzy C-means

n_samples = 2000
n_clusters = 4
centers = [(-5, -5), (0, 0), (5, 5), (7, 10)]
X, _ = make_blobs(n_samples=n_samples, n_features=2, cluster_std=1.0,
                    centers=centers, shuffle=False, random_state=42)
model = fcm.FCM(n_clusters)
# 如果使用別的distance function,如haversine distance
# model = fcm.FCM(n_clusters, distance_func=haversine_distances)
model.fit(X)
centers = model.cluster_centers_
labels = model.labels_

等大聚類

n_samples = 2000
n_clusters = 3
X = np.random.rand(n_samples, 2)
# 使用minmax flow方式求解
model = equal.SameSizeKMeansMinCostFlow(n_clusters)
# 使用heuristics方法求解
model = equal.SameSizeKMeansHeuristics(n_clusters)
model.fit(X)
centers = model.cluster_centers_
labels = model.labels_

  

圖中共2000個正態分布的點,聚成3類,分別有667,667和666個點。

最小和最大規模限制

n_samples = 2000
n_clusters = 3
X = np.random.rand(n_samples, 2)
model = minmax.MinMaxKMeansMinCostFlow(n_clusters, size_min=400,   size_max=800)
model.fit(X)
centers = model.cluster_centers_
labels = model.labels_

獲取結果聚類size分別為753, 645, 602

Deterministic Annealing

n_samples = 2000
n_clusters = 3
X = np.random.rand(n_samples, 2)
# distribution 表明各cluster目標的比例
model = da.DeterministicAnnealing(n_clusters, distribution=[0.1, 0.6, 0.3])
model.fit(X)
centers = model.cluster_centers_
labels = model.labels_

  

獲取的結果cluster size分別為:1200,600和200。對應比例為0.6, 0.3和0.1。

 

總結:代碼可以直接拿過來用,但是由於其中的方法全部分開到其他的地方了,一個方法往往牽連很多個包,所以到現在都沒怎么仔細看,其中setup.py是將.pyx文件轉換成python解釋器可以讀取運行的文件,運營到服務器上直接導包,無法將方法帶過來,需要在所有的導包之前操作一下

import pyximport
pyximport.install()

這個放到代碼最上面就ok, 別問我怎么知道的,問就是找了一天的bug, 專業采坑填坑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM