一,归类
1,生活中我们常常会遇到很多归类的问题,我们会习惯用的方式就是先设定一个类别标准,然后根据这个标准来分类,比如我们按照苹果的特征来分类,当你熟悉苹果的特征之后,再拿一个过来你就会归位苹果类,那么问题来了,如果一个水果外表类似苹果,但是其他特征都不类似于苹果,我们怎么分类?
很明显上面遇到的挑战就是没有,没有类别标记,什么意思?就是说我们没有一个明显的类别来标记它到底属于哪一类
二,算法
1,k-means 算法(当然这个是个术语你不懂,你也不需要懂,只需要看懂我下面通俗的表述就行)
最近我们好多人熟知的女神林志玲结婚了,对,没错,嫁给了日本boy。然后我看到了一个31岁美女自己写的一个公众号,写了一片文章,大概意思就是通过林志玲的事情,去描述了一番爱情婚姻的想法,但是有个很明显的bug,就是她写的东西在往林志玲上靠,说粗暴一点就是,我比林志玲也差不到哪里去,我也要像她那样怎么,,,(只举例,无歧视)。
好,我们提出问题,假设有4个美女,然后我们定义两个变量 x:年龄,y:颜值,这里为了简化,我只定义二维的两个变量
美女 | Feature1(x):年龄 | Feature2(y):颜值 |
美女A | 1 | 1 |
美女B | 2 | 1 |
美女C | 4 | 3 |
美女D | 5 | 4 |
上面的数据是随机数据,那我抛出一个问题?这四大美女(或者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]的值变化小于给定的阀值。