Python机器学习之K-Means聚类实现详解


Posted in Python onFebruary 22, 2018

本文为大家分享了Python机器学习之K-Means聚类的实现代码,供大家参考,具体内容如下

1.K-Means聚类原理

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。其基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
算法大致流程为:(1)随机选取k个点作为种子点(这k个点不一定属于数据集);(2)分别计算每个数据点到k个种子点的距离,离哪个种子点最近,就属于哪类;(3)重新计算k个种子点的坐标(简单常用的方法是求坐标值的平均值作为新的坐标值;(4)重复2、3步,直到种子点坐标不变或者循环次数完成。

2.数据及其寻找初步的聚类中心

数据为Matlab加载格式(mat),包含X变量,数据来源为(大家可以去这下载),X为300*2维变量,由于是2维,所以基本上就是在平面坐标轴上的一些点中进行聚类。

我们首先构建初步寻找聚类中心(centroids,质心)函数,再随机设置初始质心,通过欧氏距离初步判断X的每一个变量属于哪个质心。代码为:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat

def find_closest_centroids(X, centroids):
  m = X.shape[0]
  k = centroids.shape[0] #要聚类的类别个数
  idx = np.zeros(m) 
  
  for i in range(m):
    min_dist = 1000000 #迭代终止条件
    for j in range(k):
      dist = np.sum((X[i,:] - centroids[j,:]) ** 2) 
      if dist < min_dist:
        # 记录当前最短距离和其中心的索引值
        min_dist = dist
        idx[i] = j
  
  return idx
data = loadmat('D:\python\Python ml\ex7data2.mat')
X = data['X']
initial_centroids = np.array([[3, 3], [6, 2], [8, 5]])

idx = find_closest_centroids(X, initial_centroids)
idx[0:3]

在这里先生成m(这里为300)个0向量,即idx,也就是假设X的每个变量均属于0类,然后再根据与初始质心的距离计算dist = np.sum((X[i,:] - centroids[j,:]) ** 2),初步判断每个变量归属哪个类,最终替代idx中的0.

3.不断迭代寻找质心的位置并实现kmeans算法

上述idx得到的300维向量是判断X中每个变量的归属类别,在此基础上,再对初始质心集群位置不断调整,寻找最优质心。

def compute_centroids(X, idx, k):
  m, n = X.shape
  centroids = np.zeros((k, n))
  
  for i in range(k):
    indices = np.where(idx == i)
    centroids[i,:] = (np.sum(X[indices,:], axis=1) / len(indices[0])).ravel()
  #这里简单的将该类中心的所有数值求平均值作为新的类中心
return centroids
compute_centroids(X, idx, 3)

根据上述函数,来构建kmeans函数实现K-means聚类算法。然后根据得到的每个变量归属类别与质心坐标,进行可视化。

def run_k_means(X, initial_centroids, max_iters):
  m, n = X.shape
  k = initial_centroids.shape[0]
  idx = np.zeros(m)
  centroids = initial_centroids
  
  for i in range(max_iters):
    idx = find_closest_centroids(X, centroids)
    centroids = compute_centroids(X, idx, k)
  
  return idx, centroids
idx, centroids = run_k_means(X, initial_centroids, 10)
cluster1 = X[np.where(idx == 0)[0],:] #获取X中属于第一个类别的数据集合,即类别1的点
cluster2 = X[np.where(idx == 1)[0],:]
cluster3 = X[np.where(idx == 2)[0],:]

fig, ax = plt.subplots(figsize=(12,8))
ax.scatter(cluster1[:,0], cluster1[:,1], s=30, color='r', label='Cluster 1')
ax.scatter(cluster2[:,0], cluster2[:,1], s=30, color='g', label='Cluster 2')
ax.scatter(cluster3[:,0], cluster3[:,1], s=30, color='b', label='Cluster 3')
ax.legend()
plt.show()

得到图形如下:

Python机器学习之K-Means聚类实现详解

image.png

4.关于初始化质心的设置

我们前边设置的初始质心:[3, 3], [6, 2], [8, 5],是事先设定的,并由此生成idx(每一变量归属类别的向量),这是后边进行kmeans聚类的基础,实际上对于二维以上数据,由于无法在平面坐标轴展示,很难一开始就设定较好的初始质心,另外,初始质心的设定也可能会影响算法的收敛性。所以需要我们再构造个初始化质心设定函数,来更好地设置初始质心。

def init_centroids(X, k):
  m, n = X.shape
  centroids = np.zeros((k, n)) #初始化零矩阵
  idx = np.random.randint(0, m, k) #返回0-m之间的整数值
  
  for i in range(k):
    centroids[i,:] = X[idx[i],:]
  
return centroids
init_centroids(X, 3)

这里所生成的初始质心位置,其实就是从X的数据中随机找3个变量作为初始值。在此基础上,令initial_centroids = init_centroids(X, 3),然后代入前边的code中,重新运行一遍即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取糗百图片代码实例
Dec 18 Python
python分割文件的常用方法
Nov 01 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python判断Abundant Number的方法
Jun 15 Python
Python类属性的延迟计算
Oct 22 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
python将文本分每两行一组并保存到文件
Mar 19 Python
python读取文本中的坐标方法
Oct 14 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 #Python
python实现微信发送邮件关闭电脑功能
Feb 22 #Python
python使用itchat实现手机控制电脑
Feb 22 #Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 #Python
Python3.4实现远程控制电脑开关机
Feb 22 #Python
python实现微信远程控制电脑
Feb 22 #Python
Python标准库笔记struct模块的使用
Feb 22 #Python
You might like
php实现发送微信模板消息的方法
2015/03/07 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
JS和canvas实现俄罗斯方块
2017/03/14 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
法国在线药房:1001Pharmacies
2021/03/07 全球购物
应届生妇产科护士求职信
2013/10/27 职场文书
怎么写好自荐信
2013/10/30 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
Python基础之数据类型知识汇总
2021/05/18 Python
CSS 一行代码实现头像与国旗的融合
2021/10/24 HTML / CSS