qq_46541199
qq_46541199
采纳率40%
2020-10-08 00:48

python keams中的问题,求大神斧正,关于list indices must be integers or slices, not tuple???????

import numpy as np
def loadDataSet(fileName):
'''
:param fileName: 文件名字
:return: 矩阵
'''
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
fltLine = list(map(float, curLine))
dataMat.append(fltLine)
return dataMat
def distEclud(vecA, vecB):
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
def randCent(dataSet, k):
'''
构建一个包含k个随机质心的集合(k行n列,n表示数据的维度/特征个数),
只需要保证质心在数据边界里面就可以了
:param dataSet: 输入数据集
:param k: 质心个数
:return:
'''
# 得到数据样本的维度
n = np.shape(dataSet)[1]
# 初始化为一个(k,n)的全零矩阵
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)
# k个质心向量的第j维数据值随机为位于(最小值,最大值)内的某一值
centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1) # random.rand(行,列)产生这个形状的矩阵,且每个元素in [0,1)
# 返回初始化得到的k个质心向量
return centroids
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
'''
:param dataSet: 输入的数据集
:param k: 聚类的个数,可调
:param distMeas: 计算距离的方法,可调
:param createCent: 初始化质心的位置的方法,可调
:return: k个类质心的位置坐标,样本所处的类&到该类质心的距离
'''
# 获取数据集样本数
m = np.shape(dataSet)[0]
# 初始化一个(m,2)全零矩阵,用来记录没一个样本所属类,距离类中心的距离
clusterAssment = np.mat(np.zeros((m, 2)))
# 创建初始的k个质心向量
centroids = createCent(dataSet, k)
# 聚类结果是否发生变化的布尔类型
clusterChanged = True
# 终止条件:所有数据点聚类结果不发生变化
while clusterChanged:
# 聚类结果变化布尔类型置为False
clusterChanged = False
# 遍历数据集每一个样本向量
for i in range(m):
# 初始化最小距离为正无穷,最小距离对应的索引为-1
minDist = float('inf')
minIndex = -1
# 循环k个类的质心
for j in range(k):
# 计算数据点到质心的欧氏距离
distJI = distMeas(centroids[j, :], dataSet[i, :])
# 如果距离小于当前最小距离
if distJI < minDist:
# 当前距离为最小距离,最小距离对应索引应为j(第j个类)
minDist = distJI
minIndex = j
# 当前聚类结果中第i个样本的聚类结果发生变化:布尔值置为True,继续聚类算法
if clusterAssment[i, 0] != minIndex:
clusterChanged = True
# 更新当前变化样本的聚类结果和平方误差
clusterAssment[i, :] = minIndex, minDist**2
# 打印k-means聚类的质心
# print(centroids)
# 遍历每一个质心
for cent in range(k):
# 将数据集中所有属于当前质心类的样本通过条件过滤筛选出来
ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]
# 计算这些数据的均值(axis=0:求列均值),作为该类质心向量
centroids[cent, :] = np.mean(ptsInClust, axis=0)
# 返回k个聚类,聚类结果及误差
return centroids, clusterAssment
datMat=loadDataSet('D:/python/files/新建文件夹/test.txt')
myCentroids,clustAssing=kMeans(datMat,4)
print(myCentroids)
print(clustAssing)

下方为报错信息
runfile('D:/python/files/新建文件夹/未命名3.py')
Traceback (most recent call last):

File "D:\python\files\新建文件夹\未命名3.py", line 283, in
myCentroids,clustAssing=kMeans(datMat,4)

File "D:\python\files\新建文件夹\未命名3.py", line 246, in kMeans
centroids = createCent(dataSet, k)

File "D:\python\files\新建文件夹\未命名3.py", line 225, in randCent
minJ = np.min(dataSet[:, j]).tolist

TypeError: list indices must be integers or slices, not tuple

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

相关推荐