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判断Abundant Number的方法
Jun 15 Python
Python 模拟购物车的实例讲解
Sep 11 Python
python绘制双柱形图代码实例
Dec 14 Python
Python多进程写入同一文件的方法
Jan 14 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python sys模块常用方法解析
Feb 20 Python
python正则表达式实例代码
Mar 03 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
Python实现粒子群算法的示例
Feb 14 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python 图片添加美颜效果
Apr 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实现求相对时间函数
2015/06/15 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
jquery实现下载图片功能
2019/07/18 jQuery
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
python中hashlib模块用法示例
2017/10/30 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
医学生个人求职信范文
2014/02/07 职场文书
药店主任岗位责任制
2014/02/10 职场文书
安全教育月活动总结
2014/05/05 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
2015年度女工工作总结
2015/10/22 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
漫画「你在春天醒来」第10卷封面公开
2022/03/21 日漫
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript