聚类算法总结

最近要在spark上做一个聚类的项目,数据量和类的个数都比较大。KMeans效果尚可,但是有点慢,因而重新看了下常用的算法。最终选用mini-batch kmeans,使用类似kmeans++的方法来初始化类中心。


kMeans
     attention: init centers (randomize vs kMeans++)

mini-batch kMeans
     loops: random select samples; find closest for all samples; update centers for each sample

mean shift
     init: get centers by bandwidth
     loops: find neighbors of centers; update centers; de-duplicate

DBSCAN
     init: get densest core samples
     loops: get more core samples nearby old samples

Ward hierarchical
     init: each sample as center
     loops: merge to minimize RMSE within clusters

Spectral clustering
     steps: similarity matrix S; S=UV; kmeans of U

AP cluster
     init: get S; Rik=0, Aik=0
     loops: Rik = Sik - Max_k'!=k(Aik' + Sik'); Aik = min(0, Rkk + Sum_i'!=i,k Max(0, Ri'k)); Akk = Sum_i'!=k Max(0, Ri’k)
     end: for any i, Max_k Rik + Aik as it’s exemplar

Topic Model (LDA)

      ...

其实scikit-learn实现了很多算法,也有现成的数据集可以做做实验。例如:http://scikit-learn.org/stable/modules/clustering.html 上有一些效果图,和算法扩展性的说明。

                                             A comparison of the clustering algorithms in scikit-learn



Method name Parameters Scalability Usecase Geometry (metric used)
K-Means number of clusters Very large n_samples, medium n_clusterswith MiniBatch code General-purpose, even cluster size, flat geometry, not too many clusters Distances between points
Affinity propagation damping, sample preference Not scalable with n_samples Many clusters, uneven cluster size, non-flat geometry Graph distance (e.g. nearest-neighbor graph)
Mean-shift bandwidth Not scalable withn_samples Many clusters, uneven cluster size, non-flat geometry Distances between points
Spectral clustering number of clusters Medium n_samples, small n_clusters Few clusters, even cluster size, non-flat geometry Graph distance (e.g. nearest-neighbor graph)
Ward hierarchical clustering number of clusters Large n_samples andn_clusters Many clusters, possibly connectivity constraints Distances between points
Agglomerative clustering number of clusters, linkage type, distance Large n_samples andn_clusters Many clusters, possibly connectivity constraints, non Euclidean distances Any pairwise distance
DBSCAN neighborhood size Very large n_samples, medium n_clusters Non-flat geometry, uneven cluster sizes Distances between nearest points
Gaussian mixtures many Not scalable Flat geometry, good for density estimation Mahalanobis distances to centers

聚类算法是一种常用的无监督学习方法,可以将数据集分成若干个组,每个组内的数据具有相似性。下面是一些常用的聚类算法及对应实例代码。 1. K-Means算法 K-Means算法是一种基于距离的聚类算法,其核心思想是将数据集分成K个簇,使得每个数据点都属于离其最近的簇。K-Means算法的步骤如下: 1. 随机选择K个质心(簇中心)。 2. 将每个数据点分配到距离其最近的质心所在的簇中。 3. 重新计算每个簇的质心。 4. 重复步骤2和3,直到簇中心不再改变或达到最大迭代次数。 下面是K-Means算法的Python实现代码: ```python from sklearn.cluster import KMeans # 创建数据集 X = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]] # 创建K-Means模型 kmeans = KMeans(n_clusters=2) # 训练模型 kmeans.fit(X) # 预测结果 y_pred = kmeans.predict(X) # 输出聚类结果 print(y_pred) ``` 2. 层次聚类算法 层次聚类算法是一种划分聚类算法,其核心思想是从单个数据点开始,将最相似的点组合成一个簇,逐步合并成更大的簇,直到所有数据点都被合并到同一个簇中。层次聚类算法有两种方式:自下而上的聚合和自上而下的分裂。下面是自下而上的聚合层次聚类算法的Python实现代码: ```python from scipy.cluster.hierarchy import dendrogram, linkage import matplotlib.pyplot as plt # 创建数据集 X = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]] # 计算距离矩阵 Z = linkage(X, 'ward') # 绘制树状图 plt.figure(figsize=(10, 5)) dendrogram(Z) plt.show() ``` 3. DBSCAN算法 DBSCAN算法是一种基于密度的聚类算法,其核心思想是将密度相连的数据点划分为同一个簇。DBSCAN算法的步骤如下: 1. 选择一个未访问的数据点。 2. 如果该点周围的密度达到预设的阈值,则将其作为一个新的簇的中心点,并将其密度可达的所有点加入该簇。 3. 重复步骤2,直到所有数据点都被访问。 下面是DBSCAN算法的Python实现代码: ```python from sklearn.cluster import DBSCAN # 创建数据集 X = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]] # 创建DBSCAN模型 dbscan = DBSCAN(eps=1, min_samples=2) # 训练模型 dbscan.fit(X) # 预测结果 y_pred = dbscan.labels_ # 输出聚类结果 print(y_pred) ``` 以上就是几种常用的聚类算法及对应实例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值