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重试装饰器示例
Feb 11 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
Python函数式编程
Jul 20 Python
一份python入门应该看的学习资料
Apr 11 Python
Python 获取div标签中的文字实例
Dec 20 Python
python安装numpy和pandas的方法步骤
May 27 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
Kears+Opencv实现简单人脸识别
Aug 28 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python读取ini配置的类封装代码实例
Jan 08 Python
公认8个效率最高的爬虫框架
Jul 28 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基础学习之流程控制的实现分析
2013/04/28 PHP
php生成数字字母的验证码图片
2015/07/14 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
javascript 触发事件列表 比较不错
2009/09/03 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
vue实现扫码功能
2020/01/17 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
Python MD5文件生成码
2009/01/12 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
优秀驾驶员先进事迹材料
2014/05/04 职场文书
会计学自荐信
2014/06/03 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python