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编写一个简单的Lisp解释器的教程
Apr 03 Python
python 上下文管理器使用方法小结
Oct 10 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
详解用python生成随机数的几种方法
Aug 04 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Django ORM filter() 的运用详解
May 14 Python
利用python 下载bilibili视频
Nov 13 Python
python实现简单的名片管理系统
Apr 26 Python
python状态机transitions库详解
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
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
ejs v9 javascript模板系统
2012/03/21 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
基于JavaScript FileReader上传图片显示本地链接
2016/05/27 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python可变参数用法实例分析
2017/04/02 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
django 简单实现登录验证给你
2019/11/06 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
幼儿教师个人求职信范文
2013/09/21 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
集体备课反思
2014/02/12 职场文书
监督检查工作方案
2014/05/28 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
教师听课评语大全
2014/12/31 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
springboot中的pom文件 project报错问题
2022/01/18 Java/Android