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清理子进程机制剖析
Nov 23 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
Python如何发布程序的详细教程
Oct 09 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
Python 从列表中取值和取索引的方法
Dec 25 Python
python实现维吉尼亚算法
Mar 20 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python如何调用JS文件中的函数
Aug 16 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 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匹配字符中链接地址的方法
2014/12/22 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
JavaScript触发器详解
2007/03/10 Javascript
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
围观tangram js库
2010/12/28 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
JQUERY 实现窗口滚动搜索框停靠效果(类似滚动停靠)
2013/03/27 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
JS判断数组那点事
2017/10/10 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
pycharm快捷键汇总
2020/02/14 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
公司任命书模板
2014/06/06 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
PHP设计模式(观察者模式)
2021/07/07 PHP
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫