Kmeans的Python实现

import numpy as np
import matplotlib.pyplot as plt
  
 # 加载数据
 def loadDataSet(fileName):
     data = np.loadtxt(fileName,delimiter='\t')
     return data
  
 # 欧氏距离计算
 def distEclud(x,y):
     return np.sqrt(np.sum((x-y)**2))  # 计算欧氏距离
  
 # 为给定数据集构建一个包含K个随机质心的集合
 def randCent(dataSet,k):
     m,n = dataSet.shape
     centroids = np.zeros((k,n))
     for i in range(k):
         index = int(np.random.uniform(0,m)) #
         centroids[i,:] = dataSet[index,:]
     return centroids
  
 # k均值聚类
 def KMeans(dataSet,k):
  
     m = np.shape(dataSet)[0]  #行的数目
     # 第一列存样本属于哪一簇
     # 第二列存样本的到簇的中心点的误差
     clusterAssment = np.mat(np.zeros((m,2)))
     clusterChange = True
  
     # 第1步 初始化centroids
     centroids = randCent(dataSet,k)
     while clusterChange:
         clusterChange = False
  
         # 遍历所有的样本(行数)
         for i in range(m):
             minDist = 100000.0
             minIndex = -1
  
             # 遍历所有的质心
             #第2步 找出最近的质心
             for j in range(k):
                 # 计算该样本到质心的欧式距离
                 distance = distEclud(centroids[j,:],dataSet[i,:])
                 if distance < minDist:
                     minDist = distance
                     minIndex = j
             # 第 3 步:更新每一行样本所属的簇
             if clusterAssment[i,0] != minIndex:
                 clusterChange = True
                 clusterAssment[i,:] = minIndex,minDist**2
         #第 4 步:更新质心
         for j in range(k):
             pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]  # 获取簇类所有的点
             centroids[j,:] = np.mean(pointsInCluster,axis=0)   # 对矩阵的行求均值
  
     print("Congratulations,cluster complete!")
     return centroids,clusterAssment
  
 def showCluster(dataSet,k,centroids,clusterAssment):
     m,n = dataSet.shape
     if n != 2:
         print("数据不是二维的")
         return 1
  
     mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
     if k > len(mark):
         print("k值太大了")
         return 1
  
     # 绘制所有的样本
     for i in range(m):
         markIndex = int(clusterAssment[i,0])
         plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex])
  
     mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
     # 绘制质心
     for i in range(k):
         plt.plot(centroids[i,0],centroids[i,1],mark[i])
  
     plt.show()
 dataSet = loadDataSet("test.txt")
 k = 4
 centroids,clusterAssment = KMeans(dataSet,k)
  
 showCluster(dataSet,k,centroids,clusterAssment)
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
铁锈不腻玩家:下面那个袁先生删了,问他怎么回事,头像都换不明白
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442405次浏览 4511人参与
# 春招别灰心,我们一人来一句鼓励 #
41942次浏览 531人参与
# 阿里云管培生offer #
120234次浏览 2219人参与
# 地方国企笔面经互助 #
7962次浏览 18人参与
# 同bg的你秋招战况如何? #
76670次浏览 561人参与
# 虾皮求职进展汇总 #
115613次浏览 886人参与
# 北方华创开奖 #
107431次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454658次浏览 34857人参与
# 实习必须要去大厂吗? #
55771次浏览 961人参与
# 提前批简历挂麻了怎么办 #
149901次浏览 1977人参与
# 投递实习岗位前的准备 #
1195935次浏览 18548人参与
# 你投递的公司有几家约面了? #
33205次浏览 188人参与
# 双非本科求职如何逆袭 #
662208次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4753次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157628次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11561次浏览 287人参与
# 发工资后,你做的第一件事是什么 #
12704次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35804次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20126次浏览 240人参与
# 我的上岸简历长这样 #
452016次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39299次浏览 314人参与
# 非技术岗是怎么找实习的 #
155868次浏览 2120人参与
牛客网
牛客企业服务