k-means算法
此次的作业是要求我们利用所学知识实现利用python实现k-means算法,首先我们先来简单的介绍一下k-means算法:
k-means算法接受输入量k;然后将n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”来进行计算的。
算法实现思路
k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。在利用python实现时,主要为以下5步:
①首先,设定一个k值,k值为分成类的数量,需要几个类,k就为多少;
②随机选取k个点,将这k个点作为此次聚类的中心点(在此次算法实现的过程中,由于我们是随机选取的中心点,所以每次的结果可能不同,属于正常情况);
③遍历所有的点,计算所有的点距离k个聚类中心点的距离,最终求的结果,比较所选取的点到各个聚类中心的距离,哪个聚类中心距离样本点最近,该样本点就归属于哪一类,即归属于哪个聚类中心点;
④现在,我们通过第②布所随机选区的k个中心点,进而通过第③步得到了k个聚类,现在,我们需要根据我们所得的新的聚类,计算新的聚类中心,此时,新的聚类中心即为我们所得聚类的包含的所有点的平均值,通过计算平均值,我们得到了新的聚类中心点;
⑤通过第⑤步我们得到了新的聚类中心点,再利用新的聚类中心点继续执行步骤③和步骤④,直到聚类中心点不再变化为止,最终我们会得到一个最优聚类。
实现代码
import matplotlib.pyplot as plt
import numpy as np
#加载数据
def load_data_set():
"""
加载数据
:return:返回两个数组
data_arr 原始数据的特征
label_arr 每个样本对应的类别
"""
data_arr = []
label_arr = []
f = open('存放数据的txt文件地址','r')
for line in f.readlines():
line_arr = line.strip().split()
data_arr.append([np.float(line_arr[0]),np.float(line_arr[1])])
label_arr.append(int(line_arr[2]))
return np.array(data_arr),np.array(label_arr)
x,label = load_data_set()
#绘制出数据点分析看有几个聚类
#创建k个聚类数组,用于存放属于该聚类的点
clusters = []
p1 = [6,4]
p2 = [1,3]
cluster_center = np.array([p1,p2])
k = 2
for i in range(k):
clusters.append([])
epoch = 3
for _ in range(epoch):
for j in range(k):
clusters[i] = []
#计算所有点到该聚类中心的距离
for i in range(x.shape[0]):
xi = x[i]
distances = np.sum((clusters_center-xi)**2,axis=1)
#距离哪个聚类中心点近,就把这个点的序号加到那个聚类中
c = np.argmin(distances)
clusters[c].append(i)
#重新计算k个聚类的聚类中心,(没各聚类所有的点加起来取平均值)
for i in range(k):
clusters_center[i] = np.sum(x[clusters[i]],axis=0)/len(clusters[i])
plt.scatter(x[clusters[0],0],x[clusters[0],1])
plt.scatter(x[clusters[1],0],x[clusters[1],1])