Lthero 发表于 2021-6-26 22:58

K means/K均值算法

机器学习西瓜书上的例题


import random as ra
import math
# 参考西瓜书P205页
# k = int(input())
# 全部样本---值为每个样本的密度和含糖量
D = [, , , , , , ,
   , , ]
# 开始设置分成几类 k=2 从样本中取两个初始点当作两个簇的中心
Prim = [, ]
length_D = len(D)
length_P = len(Prim)
count = 0
# 迭代轮数
Total = 4
while count < Total:
    count += 1
    # 按初始Prim个数生成两簇
    C = [ for i in Prim]# [ [] , [] ]
    for j in range(length_D):
      # 计算样本到两个中心的距离
      dist = []
      for i in range(length_P):
            temp = math.sqrt(pow(D - Prim, 2) + pow(D - Prim, 2))
            dist.append(temp)
      # 把样本划分到不同簇中
      if dist < dist:
            C.append(D)
      else:
            C.append(D)
    # 完成当前所有样本划分后,对新的簇重新生成两个中心
    for i in range(length_P):
      sum_x = 0
      sum_y = 0
      length_C = len(C)
      for j in C:
            sum_x += j
            sum_y += j
      ave_x = round(sum_x / length_C, 3)
      ave_y = round(sum_y / length_C, 3)
      # 更新簇中心
      if Prim != ave_x or Prim != ave_y:
            Prim = ave_x
            Prim = ave_y
    # 聚类结果
    print('第%d轮 当前迭代的当前簇划分' %count)
    print('第一类')
    for i in range(1, len(C)):
      print('编号', D.index(C) + 1, end=' ')
    print('\n第二类')
    for i in range(1, len(C)):
      print('编号', D.index(C) + 1, end=' ')
    print('\n均值向量为')
    print('第一类 ', Prim, '第二类 ', Prim, end='\n==============\n')


hj170520 发表于 2021-6-26 23:58

太强了,最近也准备学习这方面的知识! {:301_986:}

谢谢分享

加奈绘 发表于 2021-6-27 07:01

感谢分享,受益匪浅

西岭千秋雪 发表于 2021-6-27 16:41

太厉害了
页: [1]
查看完整版本: K means/K均值算法