使用k均值聚类算法对表4.1中的数据进行聚类。代码参考P281。
创建一个名为 testSet.txt
的文本文件,将以下内容复制粘贴进去保存即可:
0 0
1 2
3 1
8 8
9 10
10 7
表4.1
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 17 16:59:58 2025
@author: 破无差
"""
import matplotlib.pyplot as plt
import numpy as np
def loadDataSet(fileName):
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
fitLine = list(map(float, curLine))
dataMat.append(fitLine)
return dataMat
def distEclud(vecA, vecB):
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
def randCent(dataSet, k):
n = np.shape(dataSet)[1]
centroids = np.mat(np.zeros((k, n)))
for j in range(n):
minJ = np.min(dataSet[:, j])
maxJ = np.max(dataSet[:, j])
rangeJ = float(maxJ - minJ)
centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1)
return centroids
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = np.shape(dataSet)[0]
clusterAssment = np.mat(np.zeros((m, 2)))
centroids = createCent(dataSet, k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = float('inf')
minIndex = -1
for j in range(k):
distJI = distMeas(centroids[j, :], dataSet[i, :])
if distJI < minDist:
minDist = distJI
minIndex = j
if clusterAssment[i, 0] != minIndex:
clusterChanged = True
clusterAssment[i, :] = minIndex, minDist ** 2
for cent in range(k):
ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]
centroids[cent, :] = np.mean(ptsInClust, axis=0)
return centroids, clusterAssment
def plotDataSet(filename):
datMat = np.mat(loadDataSet(filename))
myCentroids, clustAssing = kMeans(datMat, 4)
clustAssing = clustAssing.tolist()
myCentroids = myCentroids.tolist()
xcord = [[], [], [], []]
ycord = [[], [], [], []]
datMat = datMat.tolist()
m = len(clustAssing)
for i in range(m):
if int(clustAssing[i][0]) == 0:
xcord[0].append(datMat[i][0])
ycord[0].append(datMat[i][1])
elif int(clustAssing[i][0]) == 1:
xcord[1].append(datMat[i][0])
ycord[1].append(datMat[i][1])
elif int(clustAssing[i][0]) == 2:
xcord[2].append(datMat[i][0])
ycord[2].append(datMat[i][1])
elif int(clustAssing[i][0]) == 3:
xcord[3].append(datMat[i][0])
ycord[3].append(datMat[i][1])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord[0], ycord[0], s=20, c='b', marker='*', alpha=.5)
ax.scatter(xcord[1], ycord[1], s=20, c='r', marker='D', alpha=.5)
ax.scatter(xcord[2], ycord[2], s=20, c='c', marker='>', alpha=.5)
ax.scatter(xcord[3], ycord[3], s=20, c='k', marker='o', alpha=.5)
ax.scatter(myCentroids[0][0], myCentroids[0][1], s=100, c='k', marker='+')
ax.scatter(myCentroids[1][0], myCentroids[1][1], s=100, c='k', marker='+')
ax.scatter(myCentroids[2][0], myCentroids[2][1], s=100, c='k', marker='+')
ax.scatter(myCentroids[3][0], myCentroids[3][1], s=100, c='k', marker='+')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('DataSet')
plt.show()
if __name__ == '__main__':
plotDataSet('testSet.txt')
声明:文章仅供学习使用。著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
运行结果: