Skip to content

Commit 21397ef

Browse files
规范变量命名
1 parent 85cb587 commit 21397ef

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

src/py3.x/10.kmeans/kMeans.py

+20-20
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def loadDataSet(fileName):
1515
:return:
1616
'''
1717
# 初始化一个空列表
18-
dataMat = []
18+
dataSet = []
1919
# 读取文件
2020
fr = open(fileName)
2121
# 循环遍历文件所有行
@@ -26,9 +26,9 @@ def loadDataSet(fileName):
2626
# fltLine = [float(x) for x in curLine]
2727
# 将数据追加到dataMat
2828
fltLine = list(map(float,curLine)) # 映射所有的元素为 float(浮点数)类型
29-
dataMat.append(fltLine)
29+
dataSet.append(fltLine)
3030
# 返回dataMat
31-
return dataMat
31+
return dataSet
3232

3333

3434
def distEclud(vecA, vecB):
@@ -41,48 +41,48 @@ def distEclud(vecA, vecB):
4141
return sqrt(sum(power(vecA - vecB, 2)))
4242

4343

44-
def randCent(dataSet, k):
44+
def randCent(dataMat, k):
4545
'''
4646
为给定数据集构建一个包含K个随机质心的集合,
4747
随机质心必须要在整个数据集的边界之内,这可以通过找到数据集每一维的最小和最大值来完成
4848
然后生成0到1.0之间的随机数并通过取值范围和最小值,以便确保随机点在数据的边界之内
49-
:param dataSet:
49+
:param dataMat:
5050
:param k:
5151
:return:
5252
'''
5353
# 获取样本数与特征值
54-
m, n = shape(dataSet)
54+
m, n = shape(dataMat)
5555
# 初始化质心,创建(k,n)个以零填充的矩阵
5656
centroids = mat(zeros((k, n)))
5757
# 循环遍历特征值
5858
for j in range(n):
5959
# 计算每一列的最小值
60-
minJ = min(dataSet[:, j])
60+
minJ = min(dataMat[:, j])
6161
# 计算每一列的范围值
62-
rangeJ = float(max(dataSet[:, j]) - minJ)
62+
rangeJ = float(max(dataMat[:, j]) - minJ)
6363
# 计算每一列的质心,并将值赋给centroids
6464
centroids[:, j] = mat(minJ + rangeJ * random.rand(k, 1))
6565
# 返回质心
6666
return centroids
6767

6868

69-
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
69+
def kMeans(dataMat, k, distMeas=distEclud, createCent=randCent):
7070
'''
7171
创建K个质心,然后将每个店分配到最近的质心,再重新计算质心。
7272
这个过程重复数次,直到数据点的簇分配结果不再改变为止
73-
:param dataSet: 数据集
73+
:param dataMat: 数据集
7474
:param k: 簇的数目
7575
:param distMeans: 计算距离
7676
:param createCent: 创建初始质心
7777
:return:
7878
'''
7979
# 获取样本数和特征数
80-
m, n = shape(dataSet)
80+
m, n = shape(dataMat)
8181
# 初始化一个矩阵来存储每个点的簇分配结果
8282
# clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
8383
clusterAssment = mat(zeros((m, 2)))
8484
# 创建质心,随机K个质心
85-
centroids = createCent(dataSet, k)
85+
centroids = createCent(dataMat, k)
8686
# 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
8787
clusterChanged = True
8888
while clusterChanged:
@@ -95,7 +95,7 @@ def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
9595
for j in range(k):
9696
# 计算数据点到质心的距离
9797
# 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
98-
distJI = distMeas(centroids[j, :], dataSet[i, :])
98+
distJI = distMeas(centroids[j, :], dataMat[i, :])
9999
# 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
100100
if distJI < minDist:
101101
minDist = distJI
@@ -108,38 +108,38 @@ def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
108108
# 遍历所有质心并更新它们的取值
109109
for cent in range(k):
110110
# 通过数据过滤来获得给定簇的所有点
111-
ptsInClust = dataSet[nonzero(clusterAssment[:, 0].A == cent)[0]]
111+
ptsInClust = dataMat[nonzero(clusterAssment[:, 0].A == cent)[0]]
112112
# 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
113113
centroids[cent, :] = mean(ptsInClust, axis=0)
114114
# 返回所有的类质心与点分配结果
115115
return centroids, clusterAssment
116116

117117

118-
def biKmeans(dataSet, k, distMeas=distEclud):
118+
def biKmeans(dataMat, k, distMeas=distEclud):
119119
'''
120120
在给定数据集,所期望的簇数目和距离计算方法的条件下,函数返回聚类结果
121-
:param dataSet:
121+
:param dataMat:
122122
:param k:
123123
:param distMeas:
124124
:return:
125125
'''
126-
m, n = shape(dataSet)
126+
m, n = shape(dataMat)
127127
# 创建一个矩阵来存储数据集中每个点的簇分配结果及平方误差
128128
clusterAssment = mat(zeros((m, 2)))
129129
# 计算整个数据集的质心,并使用一个列表来保留所有的质心
130-
centroid0 = mean(dataSet, axis=0).tolist()[0]
130+
centroid0 = mean(dataMat, axis=0).tolist()[0]
131131
centList = [centroid0]
132132
# 遍历数据集中所有点来计算每个点到质心的误差值
133133
for j in range(m):
134-
clusterAssment[j, 1] = distMeas(mat(centroid0), dataSet[j, :]) ** 2
134+
clusterAssment[j, 1] = distMeas(mat(centroid0), dataMat[j, :]) ** 2
135135
# 对簇不停的进行划分,直到得到想要的簇数目为止
136136
while (len(centList) < k):
137137
# 初始化最小SSE为无穷大,用于比较划分前后的SSE
138138
lowestSSE = inf
139139
# 通过考察簇列表中的值来获得当前簇的数目,遍历所有的簇来决定最佳的簇进行划分
140140
for i in range(len(centList)):
141141
# 对每一个簇,将该簇中的所有点堪称一个小的数据集
142-
ptsInCurrCluster = dataSet[nonzero(clusterAssment[:, 0].A == i)[0], :]
142+
ptsInCurrCluster = dataMat[nonzero(clusterAssment[:, 0].A == i)[0], :]
143143
# 将ptsInCurrCluster输入到函数kMeans中进行处理,k=2,
144144
# kMeans会生成两个质心(簇),同时给出每个簇的误差值
145145
centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)

0 commit comments

Comments
 (0)