K-Means Clustering 笔记

Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering论文笔记 Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering论文链接零碎知识网络架构损失函数优化预训练分步训练重构损失聚类损失 论文链接 零碎知识 因为在数据的隐层表达学习过程中没有一个明确的聚类促进目标,所以训练出来的结果可能时好时坏。 网络架构 整体和普通的autoencoder一样,只不过在损失函数处增加一个聚类损失。这篇文章中的decoder和encoder是完全对称的。 损失函数 xix_ixi​是数据 阅读详情

本文地址:https://my.oschina.net/zenglingfan/blog/178356​​​​​​​ 

K-Means Clustering(k均值聚类算法) 属于无监督学习算法, 它可以发现 k 个不同的簇, 每个簇的质心采用簇中所含值的均值计算而成.

 优点 容易实现
 缺点 可能收敛到局部最小值, 在大规模数据集上收敛较慢
 适用数据类型 数值型 


基础概念
1. 无监督学习
目标变量不存在, 即不区分训练集与测试集, 没有训练阶段.

2. SSE
Sum of Squared Error(SSE, 误差平方和), 用于度量聚类效果的指标, 它是样本点到其所属簇的质心的距离的平方和, SSE 值越小表示数据点越接近它们的质心, 聚类效果也越好.

算法描述
1. K-Means
(1). 随机选取K个质心
(2). 遍历每个样本点, 与距离其最近的质心作为一簇, 最后共生成 K 个簇 (代码 47-60 行)
(3). 重新计算K个质心, 即将每个簇中所有样本点求均值, 得到新的质心 (代码 66-68 行)
(4). 重复(2)->(3), 若 (2) 进行完后, 每个样本点所属的簇都没有发生改变, 则聚类完成
(5). 当聚类完成后, 应该能得到K个质心的坐标, 各个样本点所属的簇及其与质心的误差(距离)

2. 二分 K-Means
二分 K-Means 算法是为了解决 K-Means 会碰到的收敛到局部最小值的情况而提出的.
(1). 初始化时, 将所有样本点作为一个簇 (代码 82-83 行)
(2). 每一步划分都增加一个簇, 直至簇的总数为 K 为止
(3). 每次划分时, 都尝试对当前每个簇进行 K=2 的 K-Means 划分, 划分完后, 将此簇划分出来的 2 个簇的 SSE 与其他簇的 SSE 相加; 取总 SSE 最小的划分为当前划分 (代码 95 - 108 行)

算法流程图
1. K-Means

2. 二分 K-Means

代码

# -*- coding: utf-8 -* 
from numpy import *

# 加载数据, 最后一列为其实际所属类别
# 数据由 tab 分隔
def loadDataSet(fileName):      
    dataMat = []                
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = map(float,curLine) # map all elements to float()
        dataMat.append(fltLine)
    return dataMat


# 计算两个向量的欧氏距离
def distEclud(vecA, vecB):
    return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB)


# 基于数据集构建 K 个随机质心, 这些质心必须在数据集的范围内
def randCent(dataSet, k):
    n = shape(dataSet)[1]
    centroids = mat(zeros((k,n)))   # 存放随机质心, k 行 n 列
    for j in range(n):  
        minJ = min(dataSet[:,j])    # 第 j 列的最小值
        rangeJ = float(max(dataSet[:,j]) - minJ)    # 第 j 列的范围
        centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
    return centroids
 

# kMeans 算法
# 1. 参数 k 表示需要划分的簇的大小
# 2. 返回值为分好类后的质心 及 各个样本点所属簇和样本点到质心的距离
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    m = shape(dataSet)[0]            # 数据集行数, 即样本数

    # 存放簇分配结果, 第 1 列为簇索引, 第二列为存储误差(当前点到质心的距离)
    # 误差可以用来评价聚类的效果
    clusterAssment = mat(zeros((m,2)))

    # 初始取 k 个随机质心
    centroids = createCent(dataSet, k)
    clusterChanged = True

    # 如果遍历所有样本点后, 它们所属簇都未发生变化, 则说明分类完成
    while clusterChanged:
        clusterChanged = False
        # 对每个样本, 将其 assign 到与它距离最近的质心
        for i in range(m):
            minDist = inf; 
            minIndex = -1
            for j in range(k):
                distJI = distMeas(centroids[j,:],dataSet[i,:])
                if distJI < minDist:
                    minDist = distJI; 
                    minIndex = j

            # 样本点所属簇发生了变化
            if clusterAssment[i,0] != minIndex: 
                clusterChanged = True
            clusterAssment[i,:] = minIndex,minDist**2

        # 重新计算质心
        # 以每个簇中所有样本点的均值为新质心
        for cent in range(k):
            ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]
            centroids[cent,:] = mean(ptsInClust, axis=0) # 求均值

    return centroids, clusterAssment


# 二分 kMeans 算法
# 1. 参数 k 表示需要划分的簇的大小, distMeas 为计算两点间距离(误差)的函数
def biKmeans(dataSet, k, distMeas=distEclud):
    m = shape(dataSet)[0]
    
    # 存储每个点分配到的簇及误差
    clusterAssment = mat(zeros((m,2)))

    # 初始取所有点的均值作为质心
    centroid0 = mean(dataSet, axis=0).tolist()[0]
    centList =[centroid0]   # 初始只有一个质心

    # 遍历所有的样本点, 计算这些样本点到质心的距离(误差)
    for j in range(m):      
        clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2

    # 每个循环都会增加一个簇, 直至 k 个簇   
    while (len(centList) < k):
        lowestSSE = inf

        # 遍历所有已分的簇, 对每个簇中的数据采用 k 为 2 的 kMeans 分成两簇
        # 取划分后误差(SSE)最小的划分作为下一步的划分
        for i in range(len(centList)):
            # 取当前簇中的所有点
            ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]
            # 按 k=2 进行 kMeans 划分
            centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)
            # 计算误差
            sseSplit = sum(splitClustAss[:,1])
            sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])
            # 取最小误差
            if (sseSplit + sseNotSplit) < lowestSSE:
                bestCentToSplit = i
                bestNewCents = centroidMat
                bestClustAss = splitClustAss.copy()
                lowestSSE = sseSplit + sseNotSplit

        # 保存最佳划分的质心
        bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) 
        bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit
        centList[bestCentToSplit] = bestNewCents[0,:].tolist()[0]
        centList.append(bestNewCents[1,:].tolist()[0])

        # 保存簇索引及误差
        clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]= bestClustAss
    return mat(centList), clusterAssment


if __name__ == "__main__":
    # 测试 kMeans
    # datMat = mat(loadDataSet('testSet.txt'))
    # myCentroids, clustAssing = kMeans(datMat,4)
    # print myCentroids

    # 测试 二分 kMeans
    datMat3 = mat(loadDataSet('testSet2.txt'))
    centList,myNewAssments = biKmeans(datMat3,3)
    print centList

说明
本文为《Machine Leaning in Action》第十章(Grouping unlabeled items using k-means clustering)读书笔记, 代码稍作修改及注释. 

好文参考
1.《K-Means 算法》
2.《漫谈 Clustering (1): k-means》
3.《K-means聚类算法》

 

机器学习笔记——16 聚类(clustering):系统聚类与k-means聚类及对“距离”的重新认识(实战项目:利用k-means实现对图像的压缩) 机器学习笔记——11 k-means聚类算法及其改进(利用k-means实现对图像的压缩) 阅读详情

相关推荐

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点

这篇博客将演示如何使用KMeansCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小区域的点。

qq_40985985的博客 1684

机器人手眼标定快速精度验证方法

机器人手眼标定快速精度验证方法

laoli_的博客 1万+

K-Means Clustering

1、概述K-means算法是集简单和经典于一身的基于距离的聚类算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。2、核心思想通过迭代寻找k个类簇的一种划分方案,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小。k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 ...

apollo_miracle的博客 3782

SSE消息推送避坑指南:从Chrome兼容性到Spring超时配置

本文深入探讨了在Java Spring Boot项目中实现SSE消息推送时,从浏览器兼容性到后端配置的完整避坑指南。针对Chrome并发连接限制、Safari自动断开、Nginx代理缓冲以及Spring SseEmitter内存泄漏与超时管理等生产环境常见问题,提供了具体的解决方案和最佳实践配置,帮助开发者构建稳定可靠的实时推送系统。

work3的博客 451

基于ADRC算法的多旋翼飞行器抗扰动控制实践

本文详细介绍了基于ADRC算法的多旋翼飞行器抗扰动控制实践,通过线性扩张状态观测器(LESO)实时估算风力等扰动,实现提前补偿,显著提升飞行稳定性。文章结合具体案例和工程实现技巧,展示了ADRC在突风条件下的优异表现,为无人机控制提供了高效解决方案。

weixin_29284885的博客 192

k-means clustering (K-均值聚类) 理论

k-means clustering (k-均值聚类) 理论

程永强 1862

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

算法——K-均值聚类K-Means Clustering

K-均值聚类 (K-Means Clustering)是一种经典的无监督学习算法,用于将数据集分成K个不同的簇。其核心思想是将数据点根据距离的远近分配到不同的簇中,使得簇内的点尽可能相似,簇间的点尽可能不同。

weixin_43156294的博客 2778

风力发电机缺陷检测平台

风力发电机缺陷检测平台相关内容展示

weixin_39779415的博客 1111

数字IC后端实战:如何用ICC搞定复杂模块的floorplan与powerplan(附避坑指南)

本文深入解析数字IC后端设计中复杂模块的floorplan与powerplan实战技巧,重点介绍多边形模块边界处理、MTCMOS电源网络优化及存储器摆放陷阱规避。通过Synopsys ICC工具的具体操作示例和项目实战经验,帮助工程师高效解决设计难题,提升芯片性能与可靠性。

weixin_29213525的博客 352

K均值聚类 K-means Clustering

本文主要简单介绍了k均值聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法和示例,以及模型参数等。

JasonH2021的博客 9346

【AI智能体】基于OpenCode 搭建Skills环境与项目实战开发详解

基于OpenCode 搭建Skills环境与项目实战开发详解

congge 8901

关于The Most Comprehensive Guide to K-Means Clustering You’ll Ever Need,其中代码部分笔记

【代码】关于The Most Comprehensive Guide to K-Means Clustering You’ll Ever Need,其中代码部分笔记。

weixin_73647879的博客 242

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

论文笔记 Deep k-Means: Jointly clustering with k-Means and learning representations

子空间聚类。

2201_75349501的博客 1010

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【机器学习|学习笔记】 k-means 聚类(k-means clustering ,K-Means )详解,附代码。

【机器学习|学习笔记】 k-means 聚类(k-means clustering ,K-Means )详解,附代码。

2401_89898861的博客 1067

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

retrival and clustering : week 3 k-means 笔记

华盛顿大学 machine learning 笔记。 K-means algorithm 算法步骤:  0. 初始化几个聚类中心 (cluster centers)μ1,μ2, … , μk         1. 将所有数据点分配给最近的聚类中心;           2. 将每个聚类中心的值改成分配到该点所有数据点的均值;       3. 重复1-2步骤,直到收敛到局...

weixin_30539625的博客 167

学习笔记1(OpenCV and Python K-Means Color Clustering)颜色聚类

OpenCV 和Python K-means 颜色聚类 想了很多天,打算还是重新学习一下opencv的图像处理(因为今天看了一段代码,有很多模糊的函数和用意),同时也在我的博客上记录下我的学习笔记。有不对的地方,看到了麻烦留言指正,谢谢 最近在看Adrian Rosebrock的博客,我的英语不太好,所以看的很慢,以后的笔记也是看了他的博客所记录的 下面的代码可以看出来 # import the ...

weixin_44911091的博客 1704

论文笔记:Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering

Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering1 摘要2 相关工作3 提出方法 1 摘要 降维和聚类是现在研究的两大任务。数据样本通过易于聚类的潜在表示得到的,但是实际上,潜在空间到数据的变换可能更复杂。本文将这个变换假设为一种未知的,可能是非线性函数。为了获得聚类友好型的潜层表示和更好的聚类效果...

GYY8023的博客 4141

论文笔记《A Robust k-Means Clustering Algorithm Based on Observation Point Mechanism》

tags:聚类相关原文地址:点击查看原文 问题: k-means对异常值敏感。 解决方法:在这篇论文中,作者提出了一种基于观察点机制的强健的两阶段k-means聚类算法,该算法能够在不受异常值干扰的情况下准确地发现聚类中心。 算法核心:第一步:基于一组 nondegenerate observation points 选择原始数据集的一小部分。子集很好表示原始数据集,因为它仅包含原始数据...

周君的个人博客 874

【文献阅读笔记】Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering和他的前置文献

Towards K-means-friendly Spaces: Simultaneous Deep Learning and Clustering 和 Learning From Hidden Traits: Joint Factor Analysis and Latent Clustering的文献笔记,可能存在理解错误,欢迎留言指正

weixin_42949680的博客 1220

斯坦福公开课Machine Learning笔记(九)--The K-means Clustering Algorithm

斯坦福公开课Machine Learning笔记(九)–The K-means Clustering Algorithm k-means聚类

beichao001的博客 549

机器学习笔记(九)聚类算法及实践(K-Means,DBSCAN,DPEAK,Spectral_Clustering)

聚类算法的原理介绍及Python的简单实践,主要包括K-Means,DBSCAN,DPEAK,Spectral_Clustering。

王大宝的CD 1万+

论文:Bradley P S, Bennett K P, Demiriz A. Constrained K-Means Clustering[J]. 2000, 59(1):1–34.笔记

最近在研究平衡聚类方面的问题,做了些调研,最早研究这方面是2000年实验效果在两组实际数据集上测试(简写为I与W),其中I数据集包括351个包括33维的数据点,同时每一个维度的值进行标准化处理;W数据集包括683个包括9维的数据点上图表示,分别对数据集I和W使用K-Means进行聚类,对于使用不同K的聚类结果而言(10,20,50),随着τ的上升,聚类结果中簇的数据点总数小于τ的簇数目趋势;上图表示

steppad 1437

课程笔记-三维点云处理03 ——Clustering聚类

课程笔记-三维点云处理03 ——Clustering聚类 本系列笔记是对深蓝学院所开设的课程:《三维点云处理》的笔记 课程每周更新,我也会努力将每周的知识点进行总结,并且整理成笔记发上来,欢迎各位多多交流&批评指正!! 本文主要为课程第三章的笔记! 课程链接: 三维点云处理——深蓝学院 目录 正式内容: #################################################### ...

Jason_____Wang的博客 1601
上一篇: pat a1057 栈【分块思想】
下一篇: 《机器学习实战》读书笔记-索引
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值