背景介紹:
機器學習的聚類算法在很多場景中都有應用,比如用戶群體的聚類,地址聚類等。但是,在實際問題中,我們的聚類問題常常是有類的規模限制的,比如我們需要創建幾個等大的類,或者有最小類大小的限制等。
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, 專業采坑填坑