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)
全部评论

相关推荐

06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司8个岗位
点赞 评论 收藏
分享
机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务