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网络编程学习笔记(四):域名系统
Jun 09 Python
Python tkinter事件高级用法实例
Jan 31 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
使用python绘制二元函数图像的实例
Feb 12 Python
python实现两张图片的像素融合
Feb 23 Python
Win10下Python3.7.3安装教程图解
Jul 08 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
Python定义一个函数的方法
Jun 15 Python
keras K.function获取某层的输出操作
Jun 29 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 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
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP多维数组排序array详解
2017/11/21 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
给Python入门者的一些编程建议
2015/06/15 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python中np是做什么的
2020/07/21 Python
python 制作简单的音乐播放器
2020/11/25 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
公司拓展活动方案
2014/02/13 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
平安建设汇报材料
2014/12/29 职场文书
2015年教研员工作总结
2015/05/26 职场文书
运动会报道稿大全
2015/07/23 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
Python面试不修改数组找出重复的数字
2022/05/20 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL