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查询Mysql时返回字典结构的代码
Jun 18 Python
Python实现程序的单一实例用法分析
Jun 03 Python
python比较两个列表大小的方法
Jul 11 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python实现的Iou与Giou代码
Jan 18 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
python中sys模块的介绍与实例
Apr 17 Python
golang特有程序结构入门教程
Jun 02 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
php基础知识:类与对象(5) static
2006/12/13 PHP
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
跟老齐学Python之编写类之二方法
2014/10/11 Python
Python中的集合类型知识讲解
2015/08/19 Python
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python 高效去重复 支持GB级别大文件的示例代码
2018/11/08 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
Django异步任务线程池实现原理
2019/12/17 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
python 画图 图例自由定义方式
2020/04/17 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
如何开启linux的ssh服务
2013/06/03 面试题
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
2014年财务部工作总结
2014/11/11 职场文书
教师个人教学反思
2016/02/23 职场文书