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 os模块学习笔记
Jun 21 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
浅谈Python 中整型对象的存储问题
May 16 Python
你真的了解Python的random模块吗?
Dec 12 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python模块的制作方法实例分析
Dec 21 Python
Django ValuesQuerySet转json方式
Mar 16 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
python 爬取华为应用市场评论
May 29 Python
python 闭包函数详细介绍
Apr 19 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中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
JS定时器实例
2013/04/17 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
js实现无缝轮播图
2020/03/09 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
给排水工程师岗位职责
2013/11/21 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
借名购房协议书范本
2014/10/06 职场文书
见习报告格式要求
2014/11/04 职场文书
2016国培学习心得体会
2016/01/08 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
同学会演讲稿
2019/04/02 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL