python实现mean-shift聚类算法


Posted in Python onJune 10, 2020

本文实例为大家分享了python实现mean-shift聚类算法的具体代码,供大家参考,具体内容如下

1、新建MeanShift.py文件

import numpy as np

# 定义 预先设定 的阈值
STOP_THRESHOLD = 1e-4
CLUSTER_THRESHOLD = 1e-1


# 定义度量函数
def distance(a, b):
 return np.linalg.norm(np.array(a) - np.array(b))


# 定义高斯核函数
def gaussian_kernel(distance, bandwidth):
 return (1 / (bandwidth * np.sqrt(2 * np.pi))) * np.exp(-0.5 * ((distance / bandwidth)) ** 2)


# mean_shift类
class mean_shift(object):
 def __init__(self, kernel=gaussian_kernel):
  self.kernel = kernel

 def fit(self, points, kernel_bandwidth):

  shift_points = np.array(points)
  shifting = [True] * points.shape[0]

  while True:
   max_dist = 0
   for i in range(0, len(shift_points)):
    if not shifting[i]:
     continue
    p_shift_init = shift_points[i].copy()
    shift_points[i] = self._shift_point(shift_points[i], points, kernel_bandwidth)
    dist = distance(shift_points[i], p_shift_init)
    max_dist = max(max_dist, dist)
    shifting[i] = dist > STOP_THRESHOLD

   if(max_dist < STOP_THRESHOLD):
    break
  cluster_ids = self._cluster_points(shift_points.tolist())
  return shift_points, cluster_ids

 def _shift_point(self, point, points, kernel_bandwidth):
  shift_x = 0.0
  shift_y = 0.0
  scale = 0.0
  for p in points:
   dist = distance(point, p)
   weight = self.kernel(dist, kernel_bandwidth)
   shift_x += p[0] * weight
   shift_y += p[1] * weight
   scale += weight
  shift_x = shift_x / scale
  shift_y = shift_y / scale
  return [shift_x, shift_y]

 def _cluster_points(self, points):
  cluster_ids = []
  cluster_idx = 0
  cluster_centers = []

  for i, point in enumerate(points):
   if(len(cluster_ids) == 0):
    cluster_ids.append(cluster_idx)
    cluster_centers.append(point)
    cluster_idx += 1
   else:
    for center in cluster_centers:
     dist = distance(point, center)
     if(dist < CLUSTER_THRESHOLD):
      cluster_ids.append(cluster_centers.index(center))
    if(len(cluster_ids) < i + 1):
     cluster_ids.append(cluster_idx)
     cluster_centers.append(point)
     cluster_idx += 1
  return cluster_ids

2、调用上述py文件

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 09 11:02:08 2018

@author: muli
"""

from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt 
import random
import numpy as np
import MeanShift


def colors(n):
 ret = []
 for i in range(n):
 ret.append((random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)))
 return ret

def main():
 centers = [[-1, -1], [-1, 1], [1, -1], [1, 1]]
 X, _ = make_blobs(n_samples=300, centers=centers, cluster_std=0.4)

 mean_shifter = MeanShift.mean_shift()
 _, mean_shift_result = mean_shifter.fit(X, kernel_bandwidth=0.5)

 np.set_printoptions(precision=3)
 print('input: {}'.format(X))
 print('assined clusters: {}'.format(mean_shift_result))
 color = colors(np.unique(mean_shift_result).size)

 for i in range(len(mean_shift_result)):
  plt.scatter(X[i, 0], X[i, 1], color = color[mean_shift_result[i]])
 plt.show()


if __name__ == '__main__':
 main()

结果如图所示:

python实现mean-shift聚类算法

参考链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Python Json序列化与反序列化的示例
Jan 31 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
python3 判断列表是一个空列表的方法
May 04 Python
好的Python培训机构应该具备哪些条件
May 23 Python
python 图片去噪的方法示例
Jul 09 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
详解Python中的文件操作
Jan 14 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Python3 如何开启自带http服务
May 18 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 #Python
Python xlwt模块使用代码实例
Jun 10 #Python
python中def是做什么的
Jun 10 #Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 #Python
Python基于os.environ从windows获取环境变量
Jun 09 #Python
新手学习Python2和Python3中print不同的用法
Jun 09 #Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 #Python
You might like
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
javascript中this关键字详解
2016/12/12 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
python 实现控制鼠标键盘
2020/11/27 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
高级Java程序员面试要点
2013/08/02 面试题
采购求职信
2014/03/17 职场文书
党支部换届选举方案
2014/05/08 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
违反交通法规检讨书
2014/09/10 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python