k-means算法

数据挖掘十大算法(二):K-means聚类算法原理与实现 参考:1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取2.K-Means算法的研究分析及改进一、K-means算法原理K-means算法是最常用的一种聚类算法。算法的输入为一个样本集(或者称为点集),通过该算法可以将样本进行聚类,具有相似特征的样本聚为一类。针对每个点,计算这个点距离所有中心点最近的那个中心点,然后将这个点归为这个中心点代表的簇。一次迭代结束之后,针对每个簇类,重新计算... 阅读详情

一.k-means算法

1.概念

事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,接着,重新计算每个类的质心(即为类中心),重复这样的过程,知道质心不再改变,最终就确定了每个样本所属的类别以及每个类的质心。
这里写图片描述
由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

2.聚类和分类算法

(1)聚类算法

无监督学习算法,主要用于将相似的样本自动归到一个类别中.
…
在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。

(2)和分类算法区别

聚类算法是无监督的学习算法,而分类算法属于监督的学习算法.

3.算法流程

这里写图片描述

(1)选择聚类的个数k.
(2)任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。
(3)对每个点确定其聚类中心点。
(4)再计算其聚类新中心。
(5)重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。)
这里写图片描述

结论: K-Means 一定会停下,不可能陷入一直选质心的过程.

4.优点

(1)原理简单(靠近中心点),实现容易.
(2)聚类效果中上(依赖K的选择).
(3)空间复杂度o(N,样本点个数),时间复杂度o(I*K*N,迭代次数,中心点个数,样本点个数).

5.缺点

(1)对离群点,噪声敏感 (中心点易偏移)
(2)很难发现大小差别很大的簇及进行增量计算.
(3)结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关).

6.K值确定

(1)肘方法

Elbow method 就是“肘”方法,对于n个点的数据集,迭代计算k from 1 to n,每次聚类完成后计算每个点到其所属的簇中心的距离的平方和,可以想象到这个平方和是会逐渐变小的,直到k==n时平方和为0,因为每个点都是它所在的簇中心本身。但是在这个平方和变化过程中,会出现一个拐点也即“肘”点,下图可以看到下降率突然变缓时即认为是最佳的k值。
这里写图片描述

(2)肘方法的核心指标

肘方法的核心指标是SSE(sum of the squared errors,误差平方和),Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

(3)肘方法的核心思想

随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。这也是该方法被称为肘方法的原因。
这里写图片描述

7.代码演示

import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
X = np.hstack((cluster1, cluster2)).T
K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    meandistortions.append(sum(np.min(cdist(X,
    kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Ave Distor')
plt.title('Elbow method value K')
plt.show()

这里写图片描述

二.轮廓系数法

1.概念

轮廓系数法 (Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。
这里写图片描述
a是Xi与同簇的其他样本的平均距离,称为凝聚度;b是Xi与最近簇中所有样本的平均距离,称为分离度。

2.最近簇的定义

引用块内容
其中p是某个簇Ck中的样本。即,用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,
…
求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。

3.通过sklearn验证轮廓系数方法

轮廓系数取值为[-1, 1],其值越大越好,且当值为负时,表明 ai小于bi,样本被分配到错误的簇中,聚类结果不可接受。 对于接近0的结果,则表明聚类结果有重叠的情况。

4.实现效果图

引用块内容

三.Canopy算法配合初始聚类

1.概念

Canopy聚类最大的特点是不需要事先指定k值(即clustering的个数),因此具有很大的实际应用价值。Canopy聚类
虽然精度较低,但其在速度上有很大优势,因此可以使用Canopy聚类先对数据进行“粗”聚类,得到k值后再使用
K-means进行进一步“细”聚类。
这里写图片描述

2.Canopy+Kmeans

(1) 聚类最耗费计算的地方是计算对象相似性的时候,Canopy聚类在第一阶段选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy ,通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理.
(2) 在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy 的对象之间不进行相似性计算。(即,根据Canopy算法产生的Canopies代替初始的K个聚类中心点,由于已经将所有数据点进行Canopies有覆盖划分,在计算数据离哪个k-center最近时,不必计算其到所有k-centers的距离,只计算和它在同一个Canopy下的k-centers这样可以提高效率).

3.Canopy详解

这里写图片描述

(1)首先选择两个距离阈值:T1和T2,其中T1 > T2
(2)从list中任取一点P,用低计算成本方法快速计算点P与所有Canopy之间的距离(如果当前不存在Canopy,则把点P作为一个Canopy),如果点P与某个Canopy距离在T1以内,则将点P加入到这个Canopy
(3)如果点P曾经与某个Canopy的距离在T2以内,则需要把点P从list中删除,这一步是认为点P此时与这个Canopy已经够近了,因此它不可以再做其它Canopy的中心了
(4)重复步骤2、3,直到list为空结束

4.优点

(1)Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰.
(2)Canopy选择出来的每个Canopy的centerPoint作为K会更精确.
(3)只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量.

5.缺点

算法中T1、T2(T2 < T1)的确定问题,不容易确定.

三.Calinski-Harabasz

类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数s会高,分数s高则聚类效果越好
这里写图片描述
其中m为训练集样本数,k为类别数。B k 为类别之间的协方差矩阵,W k 为类别内部数据的协方差矩阵。tr为矩阵的迹。

四.算法优化

1.K-means++

假设已经选取了n个初始聚类中心(0小于n小于K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。

2.ISODATA

对类别数的“合并”:(当聚类结果某一类中样本数太少,或两个类间的距离太近时),“分裂”(当聚类结果中某一类的类内方差太大,将该类进行分裂)

3.Kernel k-means

将每个样本进行一个投射到高维空间的处理,然后再将处理后的数据使用普通的k-means算法思想进行聚类。

4.二分K-means

首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。隐含的一个原则就:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的质心,聚类效果就越好。所以我们就需要对误差平方和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。

5.Mini Batch K-Means

适用大数据的聚类算法

Mini Batch的好处是计算过程中不必使用所有的数据样本,而是从不同类别的样本中抽取一部分样本来代表各自类型进行计算。由于计算样本量少,所以会相应的减少运行时间,但另一方面抽样也必然会带来准确度的下降。
步骤:
(1)从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心
(2)更新质心

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import MiniBatchKMeans, KMeans
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本4个特征,共4个簇,
簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state =9)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()     # 图1
for index, k in enumerate((2,3,4,5)):
    plt.subplot(2,2,index+1)
    y_pred = MiniBatchKMeans(n_clusters=k, batch_size = 200,
    random_state=9).fit_predict(X)
score= metrics.calinski_harabaz_score(X, y_pred)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.text(.99, .01, ('k=%d, score: %.2f' % (k,score)),
transform=plt.gca().transAxes, size=10,
horizontalalignment='right')
plt.show()

这里写图片描述这里写图片描述

深入理解K-Means聚类算法 概述什么是聚类分析聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。不同的簇类型聚类旨在发现有用的对象簇,在现实中我们用到很多的簇的类型,使用不同的簇类型划分数据的结果是不同的,如下的几种簇类型。明显分离的可以看到(a)中不同组中任意两点之间的距离都大于组内任意两点之间的距离,明显分离的簇不一定是球形的,可以具有任意的形状。基于原型的簇是对象 阅读详情

相关推荐

k-means 聚类算法

文章目录k-means 聚类算法一、原理二、python实现聚类分析三、sklearn实现聚类分析四、 K-means算法优缺点 参考: 数据挖掘十大算法(二):K-means聚类算法原理与实现 K-means聚类分析算法原理、改进及实现 k-means 聚类算法 一、原理 K-means聚类算法是一种无监督分类算法,将划分出来的类簇中点的均值当作该类簇的中心点,其可以在不确定划分规则的前提下,通过对数据集合不断迭代的方法对数据集进行划分,自动计算并更新每个类簇的中心点。 K-means聚类算法是一种迭

Java_KW的博客 6541

机器学习算法之K-means(K均值聚类)算法

聚类 聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。它是一种无监督的学习(Unsupervised Learning)方法,不需要预先标注好的训练集。聚类与分类最大的区别就是分类的目标事先已知,例如猫狗识别,你在分类之前已经预先知道要将它分为猫、狗两个种类;而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来...

tttaeyang的博客 8853

K-means算法

k-means算法是一个十分经典的聚类算法,同时它也是一个无监督的算法。对于一组没有标记的数据,如果我们需要将其分为几组的话,这时候我们就可以使用到K-means算法了。

qq_52421831的博客 1802

K-means原理、优化及应用

 K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++, 距离计算优化elkan K-Means算法和大数据情况下的优化Mini Batch K-Means算法。 1. K-Means原理初探     K-Me...

weixin_42029738的博客 9万+

用java实现K-means算法,k-means聚类算法原理

用java实现K-means算法,k-means聚类算法原理

-lim-的博客 1万+

k-means算法详解

k-means算法详解 1、算法简介 k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程,即存在有先验知识的训练数据集。 k-means算法中的k代表类簇个数,means代表类簇内数...

lovejay7的博客 5339

K-means算法改进(K-means++以及二分K-means)

上一篇文章中,我在最后有说到,K-means算法由于初始“聚类中心”点是随机选取的,因此最终求得的簇的划分与随机选取的“聚类中心”有关,也就是说,可能会造成多种 k 个簇的划分情况。这是因为K-means算法收敛到了局部最小值,而非全局最小值。 为了改进这一缺点,我们可以对算法加以改进。下面,我将为大家介绍两种改进的算 法——K-means++ 和二分K-means。 一)K-means++...

MR_Trustin的博客 8107

K-means聚类算法

K-means聚类算法 K-means(K均值)是基于数据划分的无监督聚类算法,也是数据挖掘领域的十大算法之一。 何为聚类算法?在某种程度上可以理解为无监督的分类方法。 聚类算法可以分为哪些部分? 一般来说可以分为基于划分的方法、基于连通性的方法、基于密度的方法、基于概率分布模型的方法等。K-means就是经典的基于划分的聚类方法。 1、K-means的基本原理 对于基于划分的这一类聚类

autocyz 1万+

算法——K-means算法和算法改进

本文详细介绍了k-means算法,包括算法流程,算法的损失函数和收敛问题,以及许多算法的调优和改进的方法(初始质心的选择,簇内数据k的确定,算法的加速优化,对异常值的处理,混合模型,距离度量的改进,自动化调参),以及算法的python代码实现。

m0_66890670的博客 4189

机器学习之k-means算法详解

K-means算法 (无监督算法,聚类算法) 1-1 基本流程 一、概念: 二、主要特点: 三、算法流程: kmeans作用:去除奇异值 小结: 1-2 算法效果衡量标准 一、K值确定: 二、轮廓系数: 三、Canopy算法配合初始聚类: 1、Canopy简介: 2、Canopy+Kmeans: 四、Calinski-Harabasz Index: K-m...

平原的博客 5万+

K-Means聚类算法JAVA实现

使用java实现K-Means聚类算法

x_8efengfan的博客 4815

图解K-Means算法

图解K-Means算法 本文中介绍的是一种常见的无监督学习算法,名字叫做K均值算法:K-Means算法。 K-Means算法在无监督学习,尤其是聚类算法中是最为基础和重要的一个算法。它实现起来非常简单。聚类效果也很不错的,因此应用非常广泛。 本文将会从以下8个方面进行详细的讲解: 算法思想 无监督学习 在正式介绍K-Means算法之前,我们先解释一下无监督学习。用一句很通俗的话来解释: 是否有监督(supervised),我们只需要看输入的数据是否有标签 输入的数据如果带有标签,则是有监督学习,比如K

尤尔小屋 8440

保姆级教程:在RK3568上调试RGMII网口,从设备树到PHY驱动的完整避坑指南

本文提供RK3568开发板上RGMII网口调试的完整指南,涵盖硬件检查、设备树配置、驱动加载及性能优化。通过详细步骤和实战案例,帮助开发者避开常见陷阱,确保以太网功能稳定运行,特别关注PHY驱动和MDIO总线的调试技巧。

weixin_26821003的博客 323

K-means算法与K-means++算法的异同

Kmeans与Kmeans++

kuwola的博客 8027

Godot4 TileMap分层绘制全攻略:解决角色、树木遮挡混乱,打造正确视觉层级

本文详细介绍了Godot4 TileMap分层绘制技术,通过图层管理和Y-Sort功能解决2D游戏中角色与物体的遮挡问题。从基础图层设置到高级优化策略,帮助开发者打造符合自然视觉规律的场景层次,提升游戏沉浸感。特别针对TileMap和TileSet的使用提供了实用技巧和代码示例。

weixin_28717411的博客 514

别再折腾框架了!用华为应用市场官方渠道搞定GBOX,安全安装谷歌全家桶(鸿蒙HarmonyOS 3/4实测)

本文详细介绍了如何在鸿蒙系统上通过华为应用市场官方渠道安全安装GBOX,实现谷歌全家桶的无损使用。该方法避免了传统破解方式的安全风险,利用沙箱技术隔离运行环境,确保系统稳定性和数据安全。特别适合鸿蒙HarmonyOS 3/4用户安全使用谷歌生态应用。

weixin_29305313的博客 4817

k-means聚类算法&k-means++聚类算法

是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得。也就是说,聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。

m0_47498690的博客 3798

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 751

[实战] K-means算法 & 二分K-means算法

K-means算法: K-means算法是一个被广泛使用且简单的无监督算法。 K-means算法将数据分为k个簇类,使得每个簇类内部数据尽可能的相似,而簇之间的数据尽可能的不同。 K-means算法中的簇类数目为k,是用户认为给定的。 算法流程: K-means代码: from numpy import * #加载数据 def loadDataSet(fileName): #gene...

STILLxjy 1083

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 337

XTDrone——无人机基于2D激光Lidar进行二维运动规划(细节提醒以及相关报错解决)

本文介绍了在Ubuntu 20.04系统无人机基于ROS Noetic实现HectorSLAM二维激光建图与运动规划的完整流程。主要内容包括:安装必要ROS依赖库;修改HectorSLAM的launch文件,解决坐标系转换问题;配置地图发布参数以避免覆盖已建地图;启动PX4仿真环境与XTDrone通信模块;最后通过2D导航目标点实现无人机运动规划。文中详细说明了各步骤的关键配置修改,并提供了处理常见错误(如TF转换超时)的解决方案。实现了从激光SLAM建图到路径规划的过程。

weixin_45390670的博客 996

聚类算法 - K-Means、二分K-Means、K-Means 、K-Means||、Canopy、Mini Batch K-Means算法

K-Means 系列:K-Means,二分K-Means,K-Means++,K-Meansll,canopy算法,MiniBatchK-Means算法。 K-Means系列聚类算法原理:https://www.cnblogs.com/pinard/p/6164214.html 用scikit-learn学习K-Means聚类:https://www.cnblogs.com/pinar...

qfikh的博客 3649

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法。

高德地图JSAPI中旋转Marker点标签图片时候,且不旋转lable内容方法

weixin_42960380的博客 2500

聚类算法:K-Means 聚类

K-Means 聚类是一种广泛使用的无监督学习算法,旨在将数据集分成 K 个簇,使得同一簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。它简单、高效,特别适合大规模数据集。下面将详细讨论 K-Means 的原理、实施步骤、优缺点、以及应用实例。

Wei_sx的博客 6453

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 贝叶斯算法
下一篇: SVM
messi_james
博客等级 码龄8年 91粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值