搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 机器学习研习社 > 机器学习(24): k均值聚类数学推导与python实现

机器学习(24): k均值聚类数学推导与python实现

机器学习研习社 2020-08-21

重磅干货,第一时间送达
回复【
大礼包】送你机器学习资料与笔记



回顾





1、k均值聚类模型
给定样本机器学习(24): k均值聚类数学推导与python实现,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类。用C表示划分,他是一个多对一的函数,k均值聚类就是一个从样本到类的函数。
2、k均值聚类策略
k均值聚类的策略是通过损失函数最小化选取最优的划分或函数机器学习(24): k均值聚类数学推导与python实现
首先,计算样本之间的距离,这里选欧氏距离平方。
$$
机器学习(24): k均值聚类数学推导与python实现=机器学习(24): k均值聚类数学推导与python实现
然后定义样本与其所属类的中心之间的距离的总和为损失函数
机器学习(24): k均值聚类数学推导与python实现
其中机器学习(24): k均值聚类数学推导与python实现为第l个类的均值或中心
机器学习(24): k均值聚类数学推导与python实现,机器学习(24): k均值聚类数学推导与python实现是指示函数,取值1或0.
k均值聚类就是求解最优化问题:
机器学习(24): k均值聚类数学推导与python实现
3、k均值聚类算法
k均值聚类的算法是一个迭代过程,
首先:
对于给定中心值机器学习(24): k均值聚类数学推导与python实现,求划分C,是目标函数极小化:
机器学习(24): k均值聚类数学推导与python实现
即,类中心确定的情况下,将样本分到一个类中,使样本和其所属类的中心之间的距离总和最小。
然后:
对于给定的划分C,再求各个类的中心机器学习(24): k均值聚类数学推导与python实现,是目标函数极小化。
机器学习(24): k均值聚类数学推导与python实现
即,划分C确定的情况下,使样本和其所属类的中心之间的距离总和最小。求解结果,对于每个包含机器学习(24): k均值聚类数学推导与python实现个样本的类机器学习(24): k均值聚类数学推导与python实现,更新其均值机器学习(24): k均值聚类数学推导与python实现

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

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



往期阅读:






后台回复Python深度学习获取学习大礼包




机器学习研习社:目前是由国内985博士,硕士组成的团体发起并运营。主要分享和研究机器学习、深度学习、NLP 、Python,大数据等前沿知识、干货笔记和优质资源。


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《机器学习(24): k均值聚类数学推导与python实现》的版权归原作者「机器学习研习社」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注机器学习研习社微信公众号

机器学习研习社微信公众号:ml_express

机器学习研习社

手机扫描上方二维码即可关注机器学习研习社微信公众号

机器学习研习社最新文章

精品公众号随机推荐