一、K-means
K-meas算法属于无监督学习算法,适用于没有标签的数据集,属于聚类算法。聚类就是把数据对象划分为多个组或簇的过程,使得簇内对象相似度很高,簇间相似度很低。K-means属于聚类算法的一种,除了K-means,还有K-中心点算法,基于层次的方法等等。
算法思想如下:
给定一个有n个数据对象的集合,k-means方法会构建数据的k个分组,其中每个分组表示一个簇。
对于给定的分组数k,算法会首先给出一个初始的分组方法,然后通过不断迭代的方法改变分组,使得同一组内的距离越来越近,不同组间的距离越来越远。
二、算法步骤
k-means的算法步骤如下:
(1)在n个数据对象的集合中,随机的选择k个点,分别做为k个簇的中心。
(2)分别计算其余点和k个簇中心点的距离,离哪一个簇中心点最近,就将其划分到对应的簇。
(3)对于每个簇,重新计算簇中心点。
(4)不断循环下去,直至达到算法终止条件。
其中的关键点如下:
初始质心的选择,一般为随机选择。
距离度量方式采取欧氏距离
如何重新计算簇中心点,计算该簇内所有数据每一个维度的算术平均值
聚类的目标函数依赖于点到簇的质心的邻近性,使用误差的平方和(SSE)作为度量聚类质量的目标函数。
算法的停止迭代条件:
(1)设定迭代次数。
(2)簇类中心不再变化。
(3)前后两次聚类结果的SSE变化很小。
三、代码实现
数据集:6个离散点,具体坐标为:data = [[1,2],[1,4],[3,1],[3,5],[5,2],[5,4]]
将其可视化在二维平面中,利用matplolib实现,实现结果如下:
简单起见,设定K值为2,即将其分为两个簇。
初始的簇中心点分别为[3,1]
和[3,5]
算法的停止迭代条件为簇中心点不再变化,根据上面的算法步骤写出对应的代码如下:文章来源:https://www.toymoban.com/news/detail-531872.html
import matplotlib.pyplot as plt
#计算欧式距离
def Euclidean_distance(x,y):
distance = 0
for i in range(0,len(x)):
distance = distance + (x[i] - y[i]) ** 2
return distance
#数据集:
data = [[1,2],[1,4],[3,1],[3,5],[5,2],[5,4]]
#初始K值为2
k = 2
#初始化两个簇cluster_1,cluster_2
cluster_1 = []
cluster_2 = []
#初始化簇类中心
cluster_1_point = [3,1]
cluster_2_point = [3,5]
pre_cluster_1_point = [0,0]
pre_cluster_2_point = [0,0]
distance_1 = 0
distance_2 = 0
plt.scatter([1, 3, 5], [2, 1, 2], c = 'r')
plt.scatter([1, 3, 5], [4, 5, 4], c = 'b')
plt.axis([0, 6, 0, 10])
plt.show()
#定义算法的迭代停止条件是簇类中心不再变化
while True:
for point in data:
x = point[0]
y = point[1]
distance_1 = Euclidean_distance([x,y],cluster_1_point)
distance_2 = Euclidean_distance([x,y],cluster_2_point)
if distance_1 <= distance_2:
cluster_1.append((x,y))
else:
cluster_2.append((x,y))
point_x = 0
point_y = 0
#更新第一个簇的簇中心点
for point in cluster_1:
point_x = point_x + point[0]
point_y = point_y + point[1]
pre_cluster_1_point = cluster_1_point
cluster_1_point = [point_x / len(cluster_1),point_y / len(cluster_1)]
point_x = 0
point_y = 0
#更新第二个簇的簇中心点
for point in cluster_2:
point_x = point_x + point[0]
point_y = point_y + point[1]
pre_cluster_2_point = cluster_2_point
cluster_2_point = [point_x / len(cluster_2), point_y / len(cluster_2)]
if pre_cluster_1_point == cluster_1_point and pre_cluster_2_point == cluster_2_point:
break
print(set(cluster_1))
print(set(cluster_2))
得到的两个簇分别为
利用matplotlib可视化,将两个簇可视化出来,结果如下
文章来源地址https://www.toymoban.com/news/detail-531872.html
到了这里,关于K-means的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!