[如何正确使用「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. 洛谷P1129 [ZJOI2007]矩阵游戏 题解

    题目链接:https://www.luogu.org/problemnew/show/P1129 分析: 这道题不是很好想,但只要想的出来,代码不成问题. 思路1 举几个例子,我们发现, 对于任何数来 ...

  2. java中this 和 super关键字的作用

    emmmmmm也真的是好久没有写过java了,因为项目需要, 最近又必须重新拾起来了,虽然好多东西也都忘得差不多了.... 然后发现 竟然把super和this傻傻分不清.... 开个帖子记录一下: ...

  3. Hive的基本操作和数据类型

    Hive的基本操作 1.启动Hive bin/hive 2.查看数据库 hive>show databases; 3. 打开默认数据库 hive>use default; 4.显示defa ...

  4. 2019牛客多校第二场F-Partition problem(搜索+剪枝)

    Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...

  5. CSS(下)

    1.CSS边框 边框属性: 1.border-width 宽度 2.border-style 样式 none 无边框 dotted 点状虚线边框 dashed 矩形虚线边框 solid 实线边框 3. ...

  6. 四、利用SQL Server 2008 R2创建自动备份计划

    (转) 本文主要利用SQL Server 2008 R2自带的"维护计划"创建一个自动备份数据的任务. 首先,启动 Sql Management studio,确保"SQ ...

  7. 解读Android MediaPlayer 详细使用方法

        MediaPlayer具有非常强大的功能,对音视频的播放均提供了支持,为了保证播放期间系统的正常工作,需要设置"android.permission.WAKE_LOCK"权 ...

  8. <<Modern CMake>> 翻译 1. CMake 介绍

    <<Modern CMake>> 翻译 1. CMake 介绍 人们喜欢讨厌构建系统. 仅仅观看 CppCon17 上的演讲,就可以看到开发人员因为构建系统而闹笑话的例子. 这 ...

  9. internet连接共享被启用时 出现了一个错误 (null)

    服务Firewall和Internet Sharing Service都已启动还是出现此问题 注意到点选允许共享时的提示:当前已为wireless_95364开启...... 随便选一个别的适配器,开 ...

  10. vue 初始化table数据,数据闪现的问题

    使用的iview,很简单的一个table,可以扩展显示,我这里则是更改了一下,显示的也是表格,内容为明细数据. 原以为很简单的可以直接调用方法,进行数据的渲染,但是没想到,数据只是一闪而过. 百思不得 ...