kmeans聚类算法python实现_PYTHON实现K-means聚类算法

import numpy

def loadDataSet(fileName):

dataMat = []

fr = open(fileName)

for line in fr.readlines():

curLine = line.strip().split('\t') #strip 去除首尾的空格,split以tab作为分隔符分割数据。返回一个list数据

fltLine =[float(i) for i in curLine]

dataMat.append(fltLine)

return dataMat

# 计算两个向量的距离,用的是欧几里得距离

def distEclud(v1, v2):

return numpy.sqrt(numpy.sum(numpy.square(v1 - v2)))

# 构建聚簇中心,取k个(此例中为2)随机质心

def randCent(dataSet, k):

n = shape(dataSet)[1] #等价于dataSet.shape[1],得到数组的列数。同理,dataSet.shape[0]得到数组的行数。shape函数就是读取矩阵的长度

centroids = mat(zeros((k,n)))   # 每个质心有n个坐标值,总共要k个质心

for j in range(n):

minJ = dataSet[:,j].min() #第j列的最小值

maxJ = dataSet[:,j].max() #第j列的最大值

rangeJ = maxJ - minJ

centroids[:,j] = minJ + rangeJ * random.rand(k, 1) #官方文档中给出的用法是:numpy.random.rand(d0,d1,…dn) 以给定的形状创建一个数组,并在数组中加入在[0,1]之间均匀分布的随机样本。

return centroids

#def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):

def kMeans(dataSet, k):

m = shape(dataSet)[0] #等价于dataSet.shape[0] 第一维的长度,即行数

clusterAssment = mat(zeros((m, 2)))  # 用于存放该样本属于哪类及质心距离,第一列是该数据所属中心点,第二列是该数据到中心点的距离

centroids = randCent(dataSet, k)

clusterChanged = True  #判断聚类是否已经收敛,当clusterChanged的值为False时已经收敛,跳出While循环。

while clusterChanged:

clusterChanged = False

for i in range(m):  # 每个数据点分配到离它最近的质心,range(start,stop,step)用于生成一个整数列表

minDist = inf #inf代表正无穷  -inf代表负无穷

minIndex = -1

for j in range(k):

distJI = distEclud(numpy.array(centroids[j, :]), numpy.array(dataSet[i, :])) #求第j行的中心点到第i行的数据之间的距离

if distJI < minDist:

minDist = distJI;

minIndex = j

if clusterAssment[i, 0] != minIndex:

clusterChanged = True

clusterAssment[i, :] = minIndex, minDist ** 2 #  x**y 返回x的y次幂  x//y 取x除以y的整数部分

print(centroids)

for cent in range(k):  #重新计算中心点

ptsInClust = dataSet[nonzero(clusterAssment[:, 0].A == cent)[0]]  # 筛选出第一列等于cent的所有数据,即找到属于这个聚类的所有数据点。  nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数

centroids[cent, :] = mean(ptsInClust, axis=0)  # mean是求平均值的函数,

# numpy.mean(a, axis, dtype, out,keepdims )  axis 不设置值,对 m*n 个数求均值,返回一个实数

#axis = 0:压缩行,对各列求均值,返回 1* n 矩阵 axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

return centroids, clusterAssment

def show(dataSet, k, centroids, clusterAssment):  #绘图展示,这块还没看

from matplotlib import pyplot as plt

numSamples, dim = dataSet.shape

mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '

for i in range(numSamples): #画样本点,属于同一中心的用一种标记

markIndex = int(clusterAssment[i, 0])

plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])

mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '

for i in range(k): #画中心点

plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)

plt.show()

def main():

dataMat =mat(loadDataSet('E:/test.txt')) #mat转换成矩阵操作

myCentroids, clustAssing = kMeans(dataMat, 2) #函数返回一个元组,元组的括号可以省略

# print(myCentroids)

show(dataMat, 2, myCentroids, clustAssing)

if __name__ == '__main__':

main()

*代码要点精讲*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值