Mean Shift 聚类分析(附Pyhon 源代码)

Mean Shift聚类算法不需要预先知道聚类的分组数,对聚类的形状也没有限制。MeanShift聚类函数的语法格式如下:

Mean Shift(bandwidth=None, seeds=None, bin_seeding=False, min_bin_freq=1, cluster_all = True)

Mean Shift算法建立在核密度估计(kernel density estimation,KDE)的基础之上,它假设数据点集是从Probability Distribution中采样获取的,Kernel Density Estimation是从数据点集估计Probability Distribution的非参数估计方法。

算法原理: MeanShift,顾名思义,由Mean(均值)和shift(偏移)组成。也就是有一个点x,周围有很多点xi,我们计算点x移动到每个点所需要的偏移量之和,求平均,就得到平均偏移量。该偏移量包含大小和方向 ,方向就是周围分布密集的方向。然后点x往平均偏移量方向移动,再以此为新起点,不断迭代直到满足一定条件结束。 中心点就是我们上面所说的 周围的小红点就是 黄色的箭头就是我们求解得到的平均偏移向量。

以下是完整的Mean Shift 聚类的Python代码

import numpy as np
from sklearn.cluster import MeanShift, estimate_bandwidth
import datetime
start=datetime.datetime.now()

f = 'data.txt'
X = np.loadtxt(f)
data = X

# 通过下列代码可自动检测bandwidth值
# 从data中随机选取1000个样本,计算每一对样本的距离,然后选取这些距离的0.2分位数作为返回值,当n_samples很大时,这个函数的计算量是很大的。
bandwidth = estimate_bandwidth(data, quantile=0.002, n_samples=50000)
print(bandwidth)
# bin_seeding设置为True就不会把所有的点初始化为核心位置,从而加速算法
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(data)
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
from itertools import cycle

plt.figure(1)
plt.clf()  # 清楚上面的旧图形

# cycle把一个序列无限重复下去
colors = cycle('bgrcmyk')
for k, color in zip(range(n_clusters), colors):
    # current_member表示标签为k的记为true 反之false
    current_member = labels == k
    cluster_center = cluster_centers[k]
    # 画点
    plt.plot(data[current_member, 0], data[current_member, 1], color + '.')
    #画圈
    plt.plot(cluster_center[0], cluster_center[1], 'o',
             markerfacecolor=color,  #圈内颜色
             markeredgecolor='k',  #圈边颜色
             markersize=4)  #圈大小
plt.title('Mean Shift' )
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
end=datetime.datetime.now()
print(end-start)

运行结果如下图:watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZO25rKz5Yid5Y2H,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YinHeCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值