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 相关文章推荐
Django中对数据查询结果进行排序的方法
Jul 17 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
python重试装饰器的简单实现方法
Jan 31 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
Python中有几个关键字
Jun 04 Python
浅析Python 条件控制语句
Jul 15 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
Python logging自定义字段输出及打印颜色
Nov 30 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自动跳转中英文页面
2008/07/29 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Python实现购物程序思路及代码
2017/07/24 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
python通过http下载文件的方法详解
2019/07/26 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
励志演讲稿范文
2014/04/29 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
二年级数学教学反思
2016/02/16 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL