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追加元素到列表的方法
Jul 28 Python
Python数据类型详解(二)列表
May 08 Python
Python之用户输入的实例
Jun 22 Python
Python socket实现的简单通信功能示例
Aug 21 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
Oct 11 Python
Python socket聊天脚本代码实例
Jan 02 Python
python 爬取疫情数据的源码
Feb 09 Python
python支持多继承吗
Jun 19 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php5与php7的区别点总结
2019/10/11 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
Python中的闭包总结
2014/09/18 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
初中家长寄语
2014/04/02 职场文书
企业负责人任命书
2014/06/05 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
2014年预算员工作总结
2014/12/05 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript