python Mean-shift算法
python Mean-shift算法
@TOC
需要导入的包
sklearn是python的机器学习库
import numpy as np from sklearn.cluster import MeanShift import pylab from sklearn.cluster import estimate_bandwidth
生成一些数据供使用
随机生成数字,形成np格式
pylab.rcParams['figure.figsize'] = (15.0, 8.0) # X 创建300个随机坐标,范围是[-6,6] X=(np.random.rand(300,2)*12)-6 print(type(X)) # Y 创建300个随机坐标,范围是[0,1] y=np.random.randint(0,2,size=(300,1)) #plt.scatter(X[:, 0], X[:, 1], s=50);
Mean-shift算法
MeanShift(bandwidth=3.0723913799161027, bin_seeding=True, cluster_all=True,
min_bin_freq=1, n_jobs=1, seeds=None)
Parameters:
bandwidth : RBF内核里面的边界宽度
seeds : 初始化内核的种子
bin_seeding : 是否将所有的样本点作为簇中心
min_bin_freq :只接受min_bin_freq的点作为种子,以加速算法
cluster_all : 是否将所有数据点都分配到簇中,false表示将独立点进行独立(-1)
n_jobs : 并行计算数
Attributes:
cluster_centers_ : 簇中心点坐标
labels_ : 每个点的标签
from sklearn.cluster import estimate_bandwidth # 通过下列代码可自动检测bandwidth值 # 从data中随机选取100个样本,计算每一对样本的距离,然后选取这些距离的0.2分位数作为返回值,当n_samples很大时,这个函数的计算量是很大的。 bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=100) print("bandwidth:",bandwidth) from sklearn.cluster import MeanShift # bin_seeding设置为True就不会把所有的点初始化为核心位置,从而加速算法 ms = MeanShift(bandwidth=bandwidth, bin_seeding=True) ms.fit(X) labels = ms.labels_ cluster_centers = ms.cluster_centers_ # 计算类别个数 labels_unique = np.unique(labels) n_clusters = len(labels_unique) print("number of estimated clusters : %d" % n_clusters)
展示聚类结果
import matplotlib.pyplot as plt pylab.rcParams['figure.figsize'] = (15.0, 8.0) plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis') # 画出聚类中心 centers = cluster_centers plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5); plt.title("Mean Shift (clusters = %d , Bandwidth = %.1f)" % (n_clusters, bandwidth), fontsize=20); plt.show()
下面是结果图: