今天的文章介绍如何利用Mean Shift算法的基本形式对数据进行聚类操作。而有关Mean Shift算法加入核函数计算漂移向量部分的内容将不在本文讲述范围内。实际上除了聚类,Mean Shift算法还能用于计算机视觉等场合,有关该算法的理论知识请参考这篇文章。

Mean Shift算法原理

下图展示了Mean Shift算法计算飘逸向量的过程:

Mean Shift

Mean Shift算法的关键操作是通过感兴趣区域内的数据密度变化计算中心点的漂移向量,从而移动中心点进行下一次迭代,直到到达密度最大处(中心点不变)。从每个数据点出发都可以进行该操作,在这个过程,统计出现在感兴趣区域内的数据的次数。该参数将在最后作为分类的依据。

与K-Means算法不一样的是,Mean Shift算法可以自动决定类别的数目。与K-Means算法一样的是,两者都用集合内数据点的均值进行中心点的移动。

算法步骤

下面是有关Mean Shift聚类算法的步骤:在未被标记的数据点中随机选择一个点作为起始中心点center;

找出以center为中心半径为radius的区域中出现的所有数据点,认为这些点同属于一个聚类C。同时在该聚类中记录数据点出现的次数加1。

以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift。

center = center + shift。即center沿着shift的方向移动,移动距离是||shift||。

重复步骤2、3、4,直到shift的很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇C。

如果收敛时当前簇C的center与其它已经存在的簇C2中心的距离小于阈值,那么把C2和C合并,数据点出现次数也对应合并。否则,把C作为新的聚类。

重复1、2、3、4、5直到所有的点都被标记为已访问。

分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。

算法实现

下面使用Python实现了Mean Shift算法的基本形式:import numpy as npimport matplotlib.pyplot as plt# Input data setX = np.array([

[-4, -3.5], [-3.5, -5], [-2.7, -4.5],

[-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],

[-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],

[-0.5, -2.1], [-0.6, -1], [0, -1.6],

[-2.8, -1], [-2.4, -0.6], [-3.5, 0],

[-0.2, 4], [0.9, 1.8], [1, 2.2],

[1.1, 2.8], [1.1, 3.4], [1, 4.5],

[1.8, 0.3], [2.2, 1.3], [2.9, 0],

[2.7, 1.2], [3, 3], [3.4, 2.8],

[3, 5], [5.4, 1.2], [6.3, 2]

])def mean_shift(data, radius=2.0):

clusters = []    for i in range(len(data)):

cluster_centroid = data[i]

cluster_frequency = np.zeros(len(data))        # Search points in circle

while True:

temp_data = []            for j in range(len(data)):

v = data[j]                # Handle points in the circles

if np.linalg.norm(v - cluster_centroid) <= radius:

temp_data.append(v)

cluster_frequency[i] += 1

# Update centroid

old_centroid = cluster_centroid

new_centroid = np.average(temp_data, axis=0)

cluster_centroid = new_centroid            # Find the mode

if np.array_equal(new_centroid, old_centroid):                break

# Combined 'same' clusters

has_same_cluster = False

for cluster in clusters:            if np.linalg.norm(cluster['centroid'] - cluster_centroid) <= radius:

has_same_cluster = True

cluster['frequency'] = cluster['frequency'] + cluster_frequency                break

if not has_same_cluster:

clusters.append({                'centroid': cluster_centroid,                'frequency': cluster_frequency

})

print('clusters (', len(clusters), '): ', clusters)

clustering(data, clusters)

show_clusters(clusters, radius)# Clustering data using frequencydef clustering(data, clusters):

t = []    for cluster in clusters:

cluster['data'] = []

t.append(cluster['frequency'])

t = np.array(t)    # Clustering

for i in range(len(data)):

column_frequency = t[:, i]

cluster_index = np.where(column_frequency == np.max(column_frequency))[0][0]

clusters[cluster_index]['data'].append(data[i])# Plot clustersdef show_clusters(clusters, radius):

colors = 10 * ['r', 'g', 'b', 'k', 'y']

plt.figure(figsize=(5, 5))

plt.xlim((-8, 8))

plt.ylim((-8, 8))

plt.scatter(X[:, 0], X[:, 1], s=20)

theta = np.linspace(0, 2 * np.pi, 800)    for i in range(len(clusters)):

cluster = clusters[i]

data = np.array(cluster['data'])

plt.scatter(data[:, 0], data[:, 1], color=colors[i], s=20)

centroid = cluster['centroid']

plt.scatter(centroid[0], centroid[1], color=colors[i], marker='x', s=30)

x, y = np.cos(theta) * radius + centroid[0], np.sin(theta) * radius + centroid[1]

plt.plot(x, y, linewidth=1, color=colors[i])

plt.show()

mean_shift(X, 2.5)

上述代码执行结果如下:

执行结果

其他

Mean Shift算法还有很多内容未提及。其中有“动态计算感兴趣区域半径”、“加入核函数计算漂移向量”等。本文作为入门引导,暂时只覆盖这些内容。

作者:chardlau

链接:https://www.jianshu.com/p/3087aa859cb8

mean shift聚类matlab,机器学习:Mean Shift聚类算法相关推荐

  1. 分裂层次聚类matlab实现,凝聚层次聚类算法matlab源码

    <凝聚层次聚类算法matlab源码>由会员分享,可在线阅读,更多相关<凝聚层次聚类算法matlab源码(3页珍藏版)>请在人人文库网上搜索. 1.共享一个在数据挖掘课程中作为示 ...

  2. mds聚类matlab,机器学习C9笔记:MDS聚类可视化

    MDS简介 MDS是一个统计技术集合,用于可视化地描述距离集合中的相似性和差异性.对于经典的MDS的处理过程包括:输入一个包含数据集中任意两个数据点之间距离的距离矩阵,返回一个坐标集合,这个集合可以近 ...

  3. python kmeans聚类_python机器学习之k-means聚类算法(1)

    k-means算法是一种无监督的机器学习算法,虽然是机器学习,但它简单易于实现.本篇采用python语言,自主编程实现k-menas算法,当然python用专门的库函数来实现该算法,但本次主要使用该算 ...

  4. matlab对手写数字聚类的方法_scikitlearn — 聚类

    可以使用模块sklearn.cluster对未标记的数据进行聚类.每个聚类算法都有两种变体:一个是类(class)实现的 fit方法来学习训练数据上的聚类:另一个是函数(function)实现,给定训 ...

  5. 机器学习--聚类(五种主要聚类算法)

    机器学习–聚类(五种主要聚类算法) 原博文: 聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似的属 ...

  6. 机器学习实验 - MeanShift聚类

    目录 一.报告摘要 1.1 实验要求 1.2 实验思路 1.3 实验结论 二.实验内容 2.1 方法介绍 2.2 实验细节 2.2.1 实验环境 2.2.2 实验过程 2.2.3 实验与理论内容的不同 ...

  7. matlab编程实现k_means聚类(k均值聚类)

    1. 聚类的定义 以下内容摘抄自周志华<机器学习> 根据训练数据是否拥有标记信息,机器学习任务可以大致分为两大类:"监督学习"(supervised learning) ...

  8. 机器学习-第九章 聚类

    机器学习-第九章 聚类 D系鼎溜已关注 2020.02.19 10:36:17字数 3,312阅读 375 9.1 聚类任务 在无监督学习任务中,包括了密度估计.异常检测以及聚类等.其中应用最广泛的是 ...

  9. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  10. 机器学习之sklearn——聚类

    生成数据集方法:sklearn.datasets.make_blobs(n_samples,n_featurs,centers)可以生成数据集,n_samples表示个数,n_features表示特征 ...

最新文章

  1. 基于Eigen库和Matlab计算非线性多元函数最小值
  2. 有bug!用Pytorch Lightning重构代码速度更慢,修复后速度倍增
  3. 微生物组—宏基因组分析专题培训7月开课啦!北京
  4. python基础学习-装饰器进阶
  5. 循环结果添加到集合_Java Note-数据结构(4)集合
  6. AndroidのActivity之退出返回栈(二)
  7. SqlBulkCopy 批量复制数据到数据表
  8. python编程狮电脑版_w3cschool编程狮PC版-编程狮电脑版下载 v3.3.10--PC6电脑版
  9. 第5章 简易毛笔字(《Python趣味创意编程》教学视频)
  10. OpenGL+VS2013环境配置
  11. 物理术语的理解(二)
  12. dist文件夹、src文件夹、dest文件夹作用
  13. 【转贴】 java 调用SAP RFC函数 报错信息搜集
  14. 英文单词之说文解字(9)
  15. 利用python批量查询企业信息_Python 实现批量查询域名可用性
  16. 对接天猫精灵X1 (https 的申请)
  17. 双非本科,三年逆袭鹅厂,靠的不仅仅是努力
  18. 情感分析学习笔记(5)——PolarityRank算法原理讲解
  19. Linux公社 学习连接
  20. [转]金属加工工艺基础知识

热门文章

  1. html字体加粗怎么设置,css怎么设置字体加粗?
  2. 服务器系统做双备份,云服务器如何做双机热备份
  3. 2021起重机作业 (Q)模拟考试题库及软件
  4. ghpython_根据曲线曲率向量和切向量绘制椭圆
  5. win7怎么看计算机Mac地址,Win7怎么查看MAC地址?Win7查看MAC地址的两种方法
  6. 动态规划,计算股票最大收益
  7. 用友T1-商贸宝库存商品明细账
  8. java编写工字鼠标光标,鼠标指针的形状及含义
  9. 第一道web类CTF题——一起来撸猫
  10. You can't specify target table 'UpdateInfo' for update in FROM clause