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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
Python使用xlrd读取Excel格式文件的方法
Mar 10 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
Python分割指定页数的pdf文件方法
Oct 26 Python
python添加菜单图文讲解
Jun 04 Python
python科学计算之scipy——optimize用法
Nov 25 Python
浅析Python 多行匹配模式
Jul 24 Python
python super()函数的基本使用
Sep 10 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
ASP.NET Core中的配置详解
Feb 05 Python
python链表类中获取元素实例方法
Feb 23 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 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下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
JavaScript基础教程之如何实现一个简单的promise
2018/09/11 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python如何压缩新文件到已有ZIP文件
2018/03/14 Python
Django的Modelforms用法简介
2019/07/27 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
巴西在线鞋店:Shoestock
2017/10/28 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
欢迎领导检查标语
2014/06/27 职场文书
护士节活动总结
2014/08/29 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
买卖合同协议书范本
2014/10/18 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
导游词之山东孔庙
2019/11/04 职场文书
深入理解python协程
2021/06/15 Python
服务器间如何实现文件共享
2022/05/20 Servers