通过Python实践K-means算法

前言:

今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行,运行的Python环境是Python3.6以上的版本,需要用到Python中的numpy、matplotlib包,这一部分代码将K-means算法进行了实现。当然这还不是最优的代码,只是在功能上已经实现了该算法的功能。

代码部分:

  1 import numpy as np
  2 import random
  3 from matplotlib import pyplot as plt
  4
  5 class K_means(object):
  6     def __init__(self,X,k,maxIter):
  7         self.X = X#数据集   是一个矩阵
  8         self.k = k#所需要分的类的数
  9         self.maxIter = maxIter#所允许的程序执行的最大的循环次数
 10
 11     def K_means(self):
 12         row,col = self.X.shape#得到矩阵的行和列
 13
 14         dataset = np.zeros((row,col + 1))#新生成一个矩阵,行数不变,列数加1 新的列用来存放分组号别  矩阵中的初始值为0
 15         dataset[:,:-1] = self.X
 16         print("begin:dataset:\n" + repr(dataset))
 17         # centerpoints = dataset[0:2,:]#取数据集中的前两个点为中心点
 18         centerpoints = dataset[np.random.randint(row,size=k)]#采用随机函数任意取两个点
 19
 20         centerpoints[:,-1] = range(1,self.k+1)
 21         oldCenterpoints = None #用来在循环中存放上一次循环的中心点
 22         iterations = 1 #当前循环次数
 23
 24         while not self.stop(oldCenterpoints,centerpoints,iterations):
 25             print("corrent iteration:" + str(iterations))
 26             print("centerpoint:\n" + repr(centerpoints))
 27             print("dataset:\n" + repr(dataset))
 28
 29             oldCenterpoints = np.copy(centerpoints)#将本次循环的点拷贝一份 记录下来
 30             iterations += 1
 31
 32             self.updateLabel(dataset,centerpoints)#将本次聚类好的结果存放到矩阵中
 33
 34             centerpoints = self.getCenterpoint(dataset)#得到新的中心点,再次进行循环计算
 35
 36         np.save("kmeans.npy", dataset)
 37         return dataset
 38
 39     def stop(self,oldCenterpoints,centerpoints,iterations):
 40         if iterations > self.maxIter:
 41             return True
 42         return np.array_equal(oldCenterpoints,centerpoints)#返回两个点多对比结果
 43
 44
 45     def updateLabel(self,dataset,centerpoints):
 46         row,col = self.X.shape
 47         for i in range(0,row):
 48             dataset[i,-1] = self.getLabel(dataset[i,:-1],centerpoints)
 49             #[i,j] 表示i行j列
 50
 51     #返回当前行和中心点之间的距离最短的中心点的类别,即当前点和那个中心点最近就被划分到哪一部分
 52     def getLabel(self,datasetRow,centerpoints):
 53         label = centerpoints[0, -1]#先取第一行的标签值赋值给该变量
 54         minDist = np.linalg.norm(datasetRow-centerpoints[0, :-1])#计算两点之间的直线距离
 55         for i in range(1, centerpoints.shape[0]):
 56             dist = np.linalg.norm(datasetRow-centerpoints[i, :-1])
 57             if dist < minDist:#当该变距离中心点的距离小于预设的最小值,那么将最小值进行更新
 58                 minDist = dist
 59                 label = centerpoints[i,-1]
 60         print("minDist:" + str(minDist) + ",belong to label:" + str(label))
 61         return label
 62
 63     def getCenterpoint(self,dataset):
 64         newCenterpoint = np.zeros((self.k,dataset.shape[1]))#生成一个新矩阵,行是k值,列是数据集的列的值
 65         for i in range(1,self.k+1):
 66             oneCluster = dataset[dataset[:,-1] == i,:-1]#取出上一次分好的类别的所有属于同一类的点,对其求平均值
 67             newCenterpoint[i-1, :-1] = np.mean(oneCluster,axis=0)#axis=0表示对行求平均值,=1表示对列求平均值
 68             newCenterpoint[i-1, -1] = i#重新对新的中心点进行分类,初始类
 69
 70         return newCenterpoint
 71
 72     #将散点图画出来
 73     def drawScatter(self):
 74         plt.xlabel("X")
 75         plt.ylabel("Y")
 76         dataset = self.K_means()
 77         x = dataset[:, 0]  # 第一列的数值为横坐标
 78         y = dataset[:, 1]  # 第二列的数值为纵坐标
 79         c = dataset[:, -1]  # 最后一列的数值用来区分颜色
 80         color = ["none", "b", "r", "g", "y","m","c","k"]
 81         c_color = []
 82
 83         for i in c:
 84             c_color.append(color[int(i)])#给每一种类别的点都涂上不同颜色,便于观察
 85
 86         plt.scatter(x=x, y=y, c=c_color, marker="o")#其中x表示横坐标的值,y表示纵坐标的
 87         # 值,c表示该点显示出来的颜色,marker表示该点多形状,‘o’表示圆形
 88         plt.show()
 89
 90
 91 if __name__ == ‘__main__‘:
 92
 93
 94     ‘‘‘
 95     关于numpy中的存储矩阵的方法,这里不多介绍,可以自行百度。这里使用的是
 96     np.save("filename.npy",X)其中X是需要存储的矩阵
 97     读取的方法就是代码中的那一行代码,可以不用修改任何参数,导出来的矩阵和保存之前的格式一模一样,很方便。
 98     ‘‘‘
 99     # X = np.load("testSet-kmeans.npy")#从文件中读取数据
100     #自动生成数据
101     X = np.zeros((1,2))
102     for i in range(1000):
103         X = np.row_stack((X,np.array([random.randint(1,100),random.randint(1,100)])))
104     k = 5 #表示待分组的组数
105
106     kmeans = K_means(X=X,k=k,maxIter=100)
107     kmeans.drawScatter()

 显示效果:

原文地址:https://www.cnblogs.com/jums/p/10420603.html

时间: 2024-11-09 01:45:15

通过Python实践K-means算法的相关文章

Python实现K近邻算法&lt;KNN&gt;_分类器

收集数据 数据来源:http://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival 文本数据如下图所示: 31,65,4,1 33,58,10,1 33,60,0,1 34,59,0,2 34,66,9,2 这是关于乳腺癌已手术患者存活时间(寿命)的样本集,文本文件中共包含306个样本,样本包含的属性有: 1. 患者做手术时的年龄 opAge 2. 患者做手术的年份-1900 opYear,比如1970年做的手术,则opYear属性的值为

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

4 用python实现K均值算法 x=np.random.randint(1,100,[20,1]) y=np.zeros(20) k=3 def initcenter(x,k): return x[:k] def nearest(kc,i): d = (abs(kc - i)) w = np.where(d ==np.min(d)) return w [0] [0] kc = initcenter(x,k) nearest(kc,14) for i in range(x.shape[0]):

聚类--K均值算法

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用    1.用python实现K均值算法 K-means是一个反复迭代的过程,算法分为四个步骤:(x,k,y) import numpy as np x = np.random.randint(1,50,[20,1]) y = np.zeros(20) k = 3 # 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心:def initcenter(x, k): kc def initcenter(x,k)

机器学习算法与Python实践之(三)支持向量机(SVM)进阶

机器学习算法与Python实践之(三)支持向量机(SVM)进阶 机器学习算法与Python实践之(三)支持向量机(SVM)进阶 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

机器学习算法与Python实践之(四)支持向量机(SVM)实现

机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法.啥叫正统呢?我概念里面机器学习算法一般是这样一个步骤: 1)对于一个问题,我们用数学语言来描述它,然后建立一个模型,例如回归模型或者分类模型等

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

机器学习算法与Python实践之(二)支持向量机(SVM)初级

机器学习算法与Python实践之(二)支持向量机(SVM)初级 机器学习算法与Python实践之(二)支持向量机(SVM)初级 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离近期的邻居进行分类推断(投票法)或者回归.假设K=1.那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习.数据都有明白的label(分类针对离散分布,回归针对连续分布),依据机器学习产

Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6-python-%E5%AE%9E%E7%8E%B0/ 1.  算法向  算法的扩展 在  算法中,如果要将数据集合  划分为  个类,使得任意数据对象  必须属于并且仅属于一个类,同时每一个类至少包含一个数据对象,那么可以用一个  的矩阵  来表示,矩阵中的任意一个元素