K-means练习

数据科学概论实验二 K-means

实验要求:

下面有几位同学的身高数据,请使用python语言,用k-means算法的原理将下列数据聚成两类,迭代次数设置为10次。身高数据为:{160,165,163,166,167,169,176,177,182,184,187,190}

K-means伪代码:

K-means练习_第1张图片

实验代码:

# 下面有几位同学的身高数据,请使用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()方法可以求得列表中值为参数的下标

你可能感兴趣的:(课堂实验,机器学习,机器学习,kmeans算法)