(数据科学学习手札14)Mean-Shift聚类法简单介绍及Python实现

不管之前介绍的K-means还是K-medoids聚类,都得事先确定聚类簇的个数,而且肘部法则也并不是万能的,总会遇到难以抉择的情况,而本篇将要介绍的Mean-Shift聚类法就可以自动确定k的个数,下面简要介绍一下其算法流程:

  1.随机确定样本空间内一个半径确定的高维球及其球心;

  2.求该高维球内质心,并将高维球的球心移动至该质心处;

  3.重复2,直到高维球内的密度随着继续的球心滑动变化低于设定的阈值,算法结束

具体的原理可以参考下面的地址,笔者读完觉得说的比较明了易懂:

http://blog.csdn.net/google19890102/article/details/51030884

而在Python中,机器学习包sklearn中封装有该算法,下面用一个简单的示例来演示如何在Python中使用Mean-Shift聚类:

一、低维

from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from matplotlib.pyplot import style
import numpy as np
'''设置绘图风格'''
style.use('ggplot')
'''生成演示用样本数据'''
data1 = np.random.normal(0,0.3,(1000,2))
data2 = np.random.normal(1,0.2,(1000,2))
data3 = np.random.normal(2,0.3,(1000,2))

data = np.concatenate((data1,data2,data3))

# data_tsne = TSNE(learning_rate=100).fit_transform(data)
'''搭建Mean-Shift聚类器'''
clf=MeanShift()
'''对样本数据进行聚类'''
predicted=clf.fit_predict(data)
colors = [['red','green','blue','grey'][i] for i in predicted]
'''绘制聚类图'''
plt.scatter(data[:,0],data[:,1],c=colors,s=10)
plt.title('Mean Shift')

二、高维

from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from matplotlib.pyplot import style
import numpy as np
'''设置绘图风格'''
style.use('ggplot')
'''生成演示用样本数据'''
data1 = np.random.normal(0,0.3,(1000,6))
data2 = np.random.normal(1,0.2,(1000,6))
data3 = np.random.normal(2,0.3,(1000,6))

data = np.concatenate((data1,data2,data3))

data_tsne = TSNE(learning_rate=100).fit_transform(data)
'''搭建Mean-Shift聚类器'''
clf=MeanShift()
'''对样本数据进行聚类'''
predicted=clf.fit_predict(data)
colors = [['red','green','blue','grey'][i] for i in predicted]
'''绘制聚类图'''
plt.scatter(data_tsne[:,0],data_tsne[:,1],c=colors,s=10)
plt.title('Mean Shift')

三、实际生活中的复杂数据

我们以之前一篇关于K-means聚类的实战中使用到的重庆美团商户数据为例,进行Mean-Shift聚类:

import matplotlib.pyplot as plt
from sklearn.cluster import MeanShift
from sklearn.manifold import TSNE
import pandas as pd
import numpy as np
from matplotlib.pyplot import style

style.use('ggplot')

data = pd.read_excel(r'C:\Users\windows\Desktop\重庆美团商家信息.xlsx')
input = pd.DataFrame({'score':data['商家评分'][data['数据所属期'] == data.iloc[0,0]],
                      'comment':data['商家评论数'][data['数据所属期'] == data.iloc[0,0]],
                      'sales':data['本月销售额'][data['数据所属期'] == data.iloc[0,0]]})

'''去缺省值'''
input = input.dropna()

input_tsne = TSNE(learning_rate=100).fit_transform(input)

'''创造色彩列表'''
with open(r'C:\Users\windows\Desktop\colors.txt','r') as cc:
    col = cc.readlines()
col = [col[i][:7] for i in range(len(col)) if col[i][0] == '#']

'''进行Mean-Shift聚类'''
clf = MeanShift()
cl = clf.fit_predict(input)

'''绘制聚类结果'''
np.random.shuffle(col)
plt.scatter(input_tsne[:,0],input_tsne[:,1],c=[col[i] for i in cl],s=8)
plt.title('Mean-Shift Cluster of {}'.format(str(len(set(cl)))))

可见在实际工作中的复杂数据用Mean-Shift来聚类因为无法控制k个值,可能会产生过多的类而导致聚类失去意义,但Mean-Shift在图像分割上用处很大。

以上便是本篇对Mean-Shift简单的介绍,如有错误望指出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏fangyangcoder

使用颜色空间进行图像分割

原文地址:https://realpython.com/python-opencv-color-spaces/

9013
来自专栏生信小驿站

Python数据处理从零开始----第四章(可视化)(3)目录正文

plt.scatter相对于plt.plot的主要优势在于,前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性(...

792
来自专栏一棹烟波

全景图转小行星视角投影原理详解

全景图是2:1比例的图片,一般是多张图像拼接而成。全景图2:1的比例可以很方便的映射到球面,而球坐标可以很方便的实现各种有趣的投影。比如小行星,水晶球,局部透视...

1542
来自专栏数据小魔方

人口金字塔图

今天跟大家分享的图表是——人口金字塔图! 人口金字塔图是按照人口年龄和性别表示人口分布状况的情况,能形象的表示人口某一年龄和性别构成。 该图表对于数据组织的要求...

3967
来自专栏阮一峰的网络日志

相似图片搜索的原理

上个月,Google把"相似图片搜索"正式放上了首页。 你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。 ? 一个对话框会出现。 ?...

5237
来自专栏PHP在线

相似图片搜索的原理

上个月,Google把”相似图片搜索”正式放上了首页。 你可以用一张图片,搜索互联网上所有与它相似的图片。点击搜索框中照相机的图标。 ? 一个对话框会出现。 ?...

3355
来自专栏Android群英传

贝塞尔曲线开发的艺术

2312
来自专栏社区的朋友们

3D 图形学基础 (下)

本文主要针对一些对3D有兴趣的同学,普及图形学知识,不涉及深入的技术探讨和样例介绍。对于不是从事相关开发的同学也能了解相关的知识。

7250
来自专栏懒人开发

(4.5)James Stewart Calculus 5th Edition:Summary of Curve Sketching

其实,上面(D)Asymptotes, 渐近线 的第3个,也提到了 Slant Asymptotes 偏渐近线 这里我们给出定义:

1432
来自专栏人工智能的秘密

算法教程:能够体现文本语义关系的关键词提取算法

关键词提取能让我们快速地了解一篇文章。在信息爆炸的时代,能够有效提取文本的关键词,对于快速、及时、高效地获取信息是非常有帮助的。本文介绍一种能够体现文本语义关系...

3450

扫码关注云+社区

领取腾讯云代金券