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标准库之多进程(multiprocessing包)介绍
Nov 25 Python
Python中使用不同编码读写txt文件详解
May 28 Python
python实现线程池的方法
Jun 30 Python
python常用函数详解
Sep 13 Python
python中reader的next用法
Jul 24 Python
Python 限制线程的最大数量的方法(Semaphore)
Feb 22 Python
Python3enumrate和range对比及示例详解
Jul 13 Python
python障碍式期权定价公式
Jul 19 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
Apr 22 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
用Python进行websocket接口测试
Oct 16 Python
Python爬虫之Selenium实现窗口截图
Dec 04 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自定义函数实现代码
2011/12/30 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
python爬虫基本知识
2018/03/05 Python
python实现自主查询实时天气
2018/06/22 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
python实现按行分割文件
2019/07/22 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
小学生自我鉴定
2013/10/12 职场文书
合作经营协议书范本
2014/09/16 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
2014年节能减排工作总结
2014/12/06 职场文书