数据科学概论实验二 K-means
实验要求:
下面有几位同学的身高数据,请使用python语言,用k-means算法的原理将下列数据聚成两类,迭代次数设置为10次。身高数据为:{160,165,163,166,167,169,176,177,182,184,187,190}
K-means伪代码:
实验代码:
# 下面有几位同学的身高数据,请使用python语言,用k-means算法的原理将下列数据聚成两类,迭代次数设置为10次。
# 身高数据为:{160,165,163,166,167,169,176,177,182,184,187,190}
import numpy as np
import random
# 计算距离
def distLength(x, y):
return np.sqrt((x-y)**2)
def kMeans(k, arr, t):
# 生成 k 个不同的随机值
rd = random.sample(range(len(arr)), k)
arrCenter = []
dist = []
# 均值向量
for i in range(k):
arrCenter.append(arr[rd[i]])
# 迭代次数
for p in range(t):
print("************第{}次迭代".format(p+1))
cluster = []
# 根据K值初始化簇个数
for i in range(k):
cluster.append([])
for i in range(len(arr)):
# 计算到每个簇的距离
for j in range(k):
dist.append(distLength(arrCenter[j], arr[i]))
cluster[dist.index(min(dist))].append(arr[i])
print("距离{}".format(dist))
print("最短距离{}".format(min(dist)) )
print(cluster)
dist.clear()
# 重新计算均值向量
for i in range(k):
avgCenter = np.mean(cluster[i])
# print(avgCenter)
if arrCenter[i] != avgCenter:
arrCenter[i] = avgCenter
return cluster
if __name__ == '__main__':
a = np.array([160, 165, 163, 166, 167, 169, 176, 177, 182, 184, 187, 190])
k = 2
t = 10
print ("最终分类结果{}".format(kMeans(k, a, t)))
实验总结:
- Python中random.sample(range(), k) 可以在range中产生k个不同的随机值
- numpy.mean()可以求一组数的平均值
- 列表的index()方法可以求得列表中值为参数的下标
版权声明:本文为weixin_43602755原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。