[如何正确使用「K均值聚类」?

1、k均值聚类模型

给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类。用C表示划分,他是一个多对一的函数,k均值聚类就是一个从样本到类的函数。

2、k均值聚类策略

k均值聚类的策略是通过损失函数最小化选取最优的划分或函数

首先,计算样本之间的距离,这里选欧氏距离平方。



然后定义样本与其所属类的中心之间的距离的总和为损失函数



其中为第l个类的均值或中心



,是指示函数,取值1或0.

k均值聚类就是求解最优化问题:



3、k均值聚类算法

k均值聚类的算法是一个迭代过程,

首先:

对于给定中心值,求划分C,是目标函数极小化:



即,类中心确定的情况下,将样本分到一个类中,使样本和其所属类的中心之间的距离总和最小。

然后:

对于给定的划分C,再求各个类的中心,是目标函数极小化。

即,划分C确定的情况下,使样本和其所属类的中心之间的距离总和最小。求解结果,对于每个包含nl个样本的类Gi,更新其均值ml:



重复以上两个步骤,知道分化不在改变。

from myUtil import *

def kMeans(dataSet, k):
m = shape(dataSet)[0] # 返回矩阵的行数 # 本算法核心数据结构:行数与数据集相同
# 列1:数据集对应的聚类中心,列2:数据集行向量到聚类中心的距离
ClustDist = mat(zeros((m, 2))) # 随机生成一个数据集的聚类中心:本例为4*2的矩阵
# 确保该聚类中心位于min(dataSet[:,j]),max(dataSet[:,j])之间
clustercents = randCenters(dataSet, k) # 随机生成聚类中心 flag = True # 初始化标志位,迭代开始
counter = [] # 计数器 # 循环迭代直至终止条件为False
# 算法停止的条件:dataSet的所有向量都能找到某个聚类中心,到此中心的距离均小于其他k-1个中心的距离
while flag:
flag = False # 预置标志位为False # ---- 1. 构建ClustDist:遍历DataSet数据集,计算DataSet每行与聚类的最小欧式距离 ----#
# 将此结果赋值ClustDist=[minIndex,minDist]
for i in xrange(m): # 遍历k个聚类中心,获取最短距离
distlist = [distEclud(clustercents[j, :], dataSet[i, :]) for j in range(k)]
minDist = min(distlist)
minIndex = distlist.index(minDist) if ClustDist[i, 0] != minIndex: # 找到了一个新聚类中心
flag = True # 重置标志位为True,继续迭代 # 将minIndex和minDist**2赋予ClustDist第i行
# 含义是数据集i行对应的聚类中心为minIndex,最短距离为minDist
ClustDist[i, :] = minIndex, minDist # ---- 2.如果执行到此处,说明还有需要更新clustercents值: 循环变量为cent(0~k-1)----#
# 1.用聚类中心cent切分为ClustDist,返回dataSet的行索引
# 并以此从dataSet中提取对应的行向量构成新的ptsInClust
# 计算分隔后ptsInClust各列的均值,以此更新聚类中心clustercents的各项值
for cent in xrange(k):
# 从ClustDist的第一列中筛选出等于cent值的行下标
dInx = nonzero(ClustDist[:, 0].A == cent)[0]
# 从dataSet中提取行下标==dInx构成一个新数据集
ptsInClust = dataSet[dInx]
# 计算ptsInClust各列的均值: mean(ptsInClust, axis=0):axis=0 按列计算
clustercents[cent, :] = mean(ptsInClust, axis=0)
return clustercents, ClustDist

参考:

https://jakevdp.github.io/PythonDataScienceHandbook

https://www.cnblogs.com/eczhou/p/7860424.html

统计学习方法14.3

100天搞定机器学习|day44 k均值聚类数学推导与python实现的更多相关文章

  1. 100天搞定机器学习|Day8 逻辑回归的数学原理

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  2. 100天搞定机器学习|day54 聚类系列:层次聚类原理及案例

    几张GIF理解K-均值聚类原理 k均值聚类数学推导与python实现 前文说了k均值聚类,他是基于中心的聚类方法,通过迭代将样本分到k个类中,使每个样本与其所属类的中心或均值最近. 今天我们看一下无监 ...

  3. 100天搞定机器学习|Day11 实现KNN

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  4. 100天搞定机器学习|Day16 通过内核技巧实现SVM

    前情回顾 机器学习100天|Day1数据预处理100天搞定机器学习|Day2简单线性回归分析100天搞定机器学习|Day3多元线性回归100天搞定机器学习|Day4-6 逻辑回归100天搞定机器学习| ...

  5. 100天搞定机器学习|Day22 机器为什么能学习?

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  6. 100天搞定机器学习|Day9-12 支持向量机

    机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...

  7. 100天搞定机器学习|Day17-18 神奇的逻辑回归

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  8. 100天搞定机器学习|Day19-20 加州理工学院公开课:机器学习与数据挖掘

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  9. 100天搞定机器学习|Day21 Beautiful Soup

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第77波-专业图表制作辅助之批量维护序列点颜色及数据标签

    2018年最后一天工作日完成第77波,7是代表完美,2个7,双重的完美,Excel催化剂的2018年从始至终共77波都充满着完美接近极致的功能体验.感谢各位一路相随,陪伴成长.最后一波,再次让数据分析 ...

  2. HBase部署与使用

    HBase部署与使用 概述 HBase的角色 HMaster 功能: 监控RegionServer 处理RegionServer故障转移 处理元数据的变更 处理region的分配或移除 在空闲时间进行 ...

  3. 关于页面scroolTop的获取

    scroolTop 发现问题 获取页面滚动高度的时候: 当html页面设置了DTD<!DOCTYPE html> document.body.scroolTop // 值总是为0: doc ...

  4. 关于tomcat-startup.bat启动失败或者一闪而过问题解决记录

    一.前言 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一个初学者来说 ...

  5. 记一次远程CMD开发过程

    开发初衷: 有些同学电脑老是要出问题,但又不是什么大问题,通常几句cmd就能搞定.之前解决方案有2:一是远程演示,我口述别人操作:一是我写个cmd脚本,但毕竟不在本机不好调试.(吐槽一下常用的远程控制 ...

  6. Python基础总结之第四天开始【格式化‘字符串’】(新手可相互督促)

    年薪20万... 字符串格式化: 先看小案例-------: a = 'hello,my name is %s,I like %s.'%('XiaoHong','football') #在字符串中,[ ...

  7. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  8. flask+uwsgi+nginx+docker-compose部署

    简单介绍 Flask这里就不多阐述了,已经是很流行的一个轻量级python框架了,对于小.中型项目特别适合.这里用docker的compose编排部署.uwsgi 简单的说明下,uWSGI是一个Web ...

  9. tensorflow学习笔记——常见概念的整理

    TensorFlow的名字中已经说明了它最重要的两个概念——Tensor和Flow.Tensor就是张量,张量这个概念在数学或者物理学中可以有不同的解释,但是这里我们不强调它本身的含义.在Tensor ...

  10. 有助于提高"锁"性能的几点建议

    有助于提高"锁"性能的几点建议 1.减少锁持有时间 public synchronized void syncMethod() { othercode1(); mutextMeth ...