KMeans算法究竟是什么?
KMeans 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的
那么说通俗一点呢其实就是对一组数据进行分类,说的这里我们就要扩展一下了
KMeans和KNN这两种算法区别在哪呢?
其实很简单,KMeans算法虽然和KNN算法都用到了欧式距离的数学模型,但是KMeans算法是一种聚类算法,是一种非监督学习模型,这类模型是含有训练数据但是没有明确的分类标签,在我们拿到一组数据时想要对杂乱的数据进行聚类时使用的算法,而KNN算法呢是一种有监督的学习模型,它不仅有训练数据还有明确的分类标签
KMeans算法图解
我们先在二维空间内随机生成100个无序的点,而我们要做的就是将这100个点分成K类,分成什么样子的K类呢,我们会在杂乱的点钟随机选择K个点作为中心点,通过计算每个点到中心点的距离找到100分别到哪个中心点是最近的那么我们就能大概划分出K个区域在不同区域内的点到他们中心点距离最小,然后我们知道这个中心点是随机选出的我们无法去控制,但是我们还要尽量约束每个点让他们的类分的更加细腻,所以我们将去计算每个区域内的点的坐标,通过计算平均坐标选取最优的中心点从而划分出最优的区域,通过中心点不断地偏移一次次迭代,我们将会划分出最合理的区域当然这个区域与我们最开始选择的中心点是有一定关系
这就是我们划分后的结果这里我们是在二维空间内进行划分K的值是5所以我们分成5类,当然空间越小,点越密集我们划分出来的类就越规则
下面我们输出一下平面下1000个无序点分成5类
算法进阶------应用
说了那么多我们的算法除了计算出乱七八糟的点似乎没有派上什么用场?
这其实是我在第一次尝试写这个算法时最想去问的?怎么应用于实际,算法其实是一种工具,而Kmeans算法就是我们数据挖掘时最好的工具,我们数据采集到一大批的杂乱数据,而我们就可以以数据中的属性为维度对杂乱的进行分类从而找到其最优的推论,当机器去分析杂乱的数据样本后当我们再去给他数据的时候他就可以直接对数据进行归纳
比如一个人身高,体重,年龄我们需要通过这些属性去分析它的患病风险,这样就可以建立三维的空间用三种属性作为空间内的坐标,找到点与点之间的联系从而建立集群,这在医学,电商等等的领域里都有了实际的应用,所以我说,算法是一种可以应用的艺术品,我们在不断提高看得见摸得着的工具时,算法这种足以改变世界的工具也在不断地自我优化着,
第一次实现KMeans算法
(第一次实现性能和功能性都是ok的但是还没有按照人工智能算法模式在走,摸着石头过河版)
import random
class Point:
'''
设置一个点将点封装成对象,这样做的好处在于后面我们需要将一些繁琐的数据产生关联,封装成对象可以直接建立联系
方便理解
缺点需要循环遍历多次浪费时间,无法实现多维空间的转换,下一篇博客将对其进行改进
'''
def __init__(self):
self.__x = None#对象的属性坐标
self.__y = None#对象的属性坐标
self.__Data = None#用来储存其他数据建立点与点之间的联系
def __str__(self):
x=str(self.x)
y=str(self.y)
return "("+x+","+y+")"
@property
def x(self):
return self.__x
@x.setter
def x(self,x):
self.__x=x
@property
def y(self):
return self.__y
@y.setter
def y(self,y):
self.__y=y
@property
def Data(self):
return self.__Data
@Data.setter
def Data(self,Data):
self.__Data=Data
class SportTools:
def MakePoint(self):
'''
随机生成2维空间内的点
:return: 1个随机点
'''
point = Point()
point.x = random.randint(-200, 200)
point.y = random.randint(-200, 200)
return point
def MakePoints(self,num):
'''
随机生成num个二维空间内的点
:param num: 多少个点
:return: 点对象的列表
'''
pointlist=[]
for n in range(num):
point=self.MakePoint()
pointlist.append(point)
return pointlist
def MakePointK(self,pointlist,N=5):