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的time模块中的常用方法整理
Jun 18 Python
Python正则捕获操作示例
Aug 19 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
python实现门限回归方式
Feb 29 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
python实现126邮箱发送邮件
May 20 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 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/01 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
微信小程序 css使用技巧总结
2017/01/09 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
深入浅析Python代码规范性检测
2020/07/31 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
先进集体获奖感言
2014/02/13 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
高三家长寄语
2014/04/03 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
房屋认购协议书
2015/01/29 职场文书
员工福利申请报告
2015/05/15 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
关于nginx 实现jira反向代理的问题
2021/09/25 Servers