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()

下面是结果图:
在这里插入图片描述

全部评论

相关推荐

点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务