白话-K-means算法

博客围绕归类问题展开,指出生活中归类常面临无类别标记的挑战。以K-means算法为例,通过四大美女按年龄和颜值分类的实例,详细阐述算法过程,包括初始分类、更新分类点、重新计算距离和分类,直至分类结果稳定,并给出最终算法描述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,归类

1,生活中我们常常会遇到很多归类的问题,我们会习惯用的方式就是先设定一个类别标准,然后根据这个标准来分类,比如我们按照苹果的特征来分类,当你熟悉苹果的特征之后,再拿一个过来你就会归位苹果类,那么问题来了,如果一个水果外表类似苹果,但是其他特征都不类似于苹果,我们怎么分类?

很明显上面遇到的挑战就是没有,没有类别标记,什么意思?就是说我们没有一个明显的类别来标记它到底属于哪一类

二,算法

1,k-means 算法(当然这个是个术语你不懂,你也不需要懂,只需要看懂我下面通俗的表述就行)

最近我们好多人熟知的女神林志玲结婚了,对,没错,嫁给了日本boy。然后我看到了一个31岁美女自己写的一个公众号,写了一片文章,大概意思就是通过林志玲的事情,去描述了一番爱情婚姻的想法,但是有个很明显的bug,就是她写的东西在往林志玲上靠,说粗暴一点就是,我比林志玲也差不到哪里去,我也要像她那样怎么,,,(只举例,无歧视)。

好,我们提出问题,假设有4个美女,然后我们定义两个变量 x:年龄,y:颜值,这里为了简化,我只定义二维的两个变量

美女Feature1(x):年龄Feature2(y):颜值
美女A11
美女B21
美女C43
美女D54

上面的数据是随机数据,那我抛出一个问题?这四大美女(或者no美女)怎么来分类呢?可能你会想当然的说,年纪大的和年纪小的,颜值高的和颜值低的,但是你难道没有发现你又个大bug吗?就是你只拿了单一变量去评判,现实生活中还有很多变量,比如身高?肥不肥?短发还是长发?工作性质?会不会理财?作得不行还是同情达意等等,所以我这里拿两个变量年龄和颜值,只是为了你能看懂我写的东西。

来来来,自认为是一朵花的可以出来我们一起来制作一个漂亮的表格。表格如下:

备注:横着的表示年龄,竖着的表示颜值。

好,不开玩笑了,我们将数据用矩阵表示(不懂没关系,只要能看懂就行)

因为这里只有4个美女,4组数据,所以为了简化,我们假设将先分为两个类别

类别1   class1 = (1,1),类别2 class2 = (2,1) 。能看懂吧,其实就是她的年龄和颜值数据用() 包起来。

将数据矩阵如下:

 

   class1=(1,1)   class2 = (2,1)

分别计算A,B,C,D四个美女到class1=(1,1)和class2=(2,1)的距离。

A到class1的距离是 =0

B到class1的距离是 =1

C到class1的距离是=3.61

D到class1的距离是 =5

按照上面的计算方式我们可以计算出:

A到class2的距离是 = 1

B到class2的距离是 = 0

C到class2的距离是 = 2.83

D到class2的距离是 =4.24

我们分别计算A,B,C,D到class1 也就是点A和class2也就是点B的距离是为了看那些点离它们最近,

距离越近我们是不是就可以用一种理想状态将它们归位一类呢。写举证如下:

0,1,3.61,5 就是分别表示到点A也即class1(1,1)的距离;

                                             1,0,2.83,4,24 就是分别表示到点B也即class2(2,1)的距离

好我们接下来就根据这个距离来分类,A到class1的距离是0,到class2的距离是1,A点到哪个更近,很明显是class1,那么我们就把A分类到class1的类别。同理B点到class1的距离是1,到class2的距离是0,B到到class2更近,所以我们将B点分类为class2.也许你会说class1=(1,1)就是A点坐标,class2=(2,1)就是B点坐标,本来就重合,肯定分类和它们一样了。那我们来看C点到class1点的距离是3.61,到class2点的距离是2.83,很明显到class2的距离更近,我们把点B归类为class2类,同理D点到class2的距离是4.24比5小,那么就归类为class2类。

我们用数据来表示,如果一个点归类到某个类我们就记为1,不属于每个类,就记为0

G0 =

这个时候我们就进行了第一次完整的分类,A点属于class1类,B,C,D点属于class2类

 

2,再次思考

上面我们把A点分为类class1类,B,C,D分为类class2类。

对于class2,有B,C,D三个点,我们能不能在进行分类呢?很明显是可以的。

从上图我们可以看出来B,C,D三点我们是可以再分类的。

对于class2类中的B,C,D三个点,我们更新它的分类点,因为B,C,D三个点是根据class2来分类的,所以我们对class2的坐标进行更新,不要问为什么,因为这个是头发掉得最厉害的那群人研究出来的。对B,C,D三个点的坐标分别求平均值的到如下:

2,3,4就是B,C,D的横坐标,1,3,4就是纵坐标。这个时候c2也即class2=(11/3,8/3)

同理我们计算A,B,C,D四个点到c1(1,1)和c2(11/3,8/3)的距离

0  1  3.61  5 就是A,B,C,D点到c1=(1,1)的距离,因为c1的坐标没有变化,所以距离还是没变化。

3.14 2.36  0.47 1.89 就是A,B,C,D点到c2=(11/3,8/3)的距离,因为C2的坐标变化了,所以距离也变化了,

很明显A点离c1的距离0 更近,B点离c1的距离1 更近,C点离c2的距离0.47 更近,D点离c2的距离1.89更近。所以如下:

此时A,B就归类为c1,C,D两点就归类为c2。

那么我们有重新计算c1的坐标,c2的坐标

c1=((1+2)/2, (1+1)/2) = (3/2, 1) ,  c2 = ((4+5)/2, (3+4)/2) = (9/2, 7/2)

那么我们的c1和c2 点的坐标如图:

我们在按照上面同样的计算方式来计算A,B,C,D点分别到新的c1和c2 点的距离,

按照距离的远近来分类

A点到c1的距离是0.5比c2的4.30 近,

B点到c1的距离是0.5比c2 的3.54近

C点到c1的距离是3.20比c2 的0.71 远

D点到c1的距离是4.61比c2的0.71 远

所以分类如下:

我们发现再次计算出来的分类还是A,B分为一类,C,D分为一类,这个时候我们就需要停止计算了,说明在分类还是这个分类结果,所以这就是最终的分类。

三,最终的算法描述(如果理解不了就明白上面推算的过程就行)

假设如下:

你的输入是k, data[n]数据集

step1:从data[n]中选择k的中心点出来,假如c[0] = data[0],c[1] = data[1],,,,,c[k-1]=data[k-1]

那么现在你就有两个数据集了,c[0.....k-1] 和data[0......n]

step2:data[0....n]的所有数据分别与c[0....k-1]数据进行比较,假设当c[i]的时候,data[0...n]与c[i]的差值最小

那么就记录下i的值,将data中与c[i]距离最少的所有data[i]标记为i 的类别

step3:重新计算c[i] = {所有编辑为i类的data数据的和}/标记为i类别的个数

step4: 重复step2 和step3,直到所有c[i]的值变化小于给定的阀值。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值