《机器学习实战》第13章-利用PCA来简化数据,Python3运行报错及解决方法
原书中的代码是在Python2上运行的,后来的新学者大多应该在用Python3了吧。笔者也是刚接触这个领域的新人,在跟着教材学习这一章的时候遇到了问题,自己写的测试程序test.py在调用pca.py程序时报错:
Traceback (most recent call last):
File "F:\Python资料\机器学习实战 中文版+源码\机器学习实战——源码 - 备份\Ch13\test.py", line 8, in <module>
lowDMat,reconMat=pca.pca(dataMat,1)
File "F:\Python资料\机器学习实战 中文版+源码\机器学习实战——源码 - 备份\Ch13\pca.py", line 15, in pca
meanVals = mean(dataMat, axis=0)
File "D:\Python\lib\site-packages\numpy\core\fromnumeric.py", line 2954, in mean
return mean(axis=axis, dtype=dtype, out=out, **kwargs)
File "D:\Python\lib\site-packages\numpy\matrixlib\defmatrix.py", line 536, in mean
return N.ndarray.mean(self, axis, dtype, out, keepdims=True)._collapse(axis)
File "D:\Python\lib\site-packages\numpy\core\_methods.py", line 73, in _mean
ret, rcount, out=ret, casting='unsafe', subok=False)
TypeError: unsupported operand type(s) for /: 'map' and 'int'
解决办法:
为了方便表述,先贴上代码。
test.py:
[code]import pca from numpy import * dataMat=pca.loadDataSet('testSet.txt') lowDMat,reconMat=pca.pca(dataMat,1) print(shape(lowDMat))
源代码pca.py
[code]''' Created on Jun 1, 2011 @author: Peter Harrington ''' from numpy import * def loadDataSet(fileName, delim='\t'): fr = open(fileName) stringArr = [line.strip().split(delim) for line in fr.readlines()] datArr = [map(float,line) for line in stringArr] return mat(datArr) def pca(dataMat, topNfeat=9999999): meanVals = mean(dataMat, axis=0) meanRemoved = dataMat - meanVals #remove mean covMat = cov(meanRemoved, rowvar=0) eigVals,eigVects = linalg.eig(mat(covMat)) eigValInd = argsort(eigVals) #sort, sort goes smallest to largest eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions reconMat = (lowDDataMat * redEigVects.T) + meanVals return lowDDataMat, reconMat def replaceNanWithMean(): datMat = loadDataSet('secom.data', ' ') numFeat = shape(datMat)[1] for i in range(numFeat): meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number) datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal #set NaN values to mean return datMat
虽然提示pca.py的第15行代码可能有错,但是实际问题却不在这一行,实际报错的原因是:
在pca.py的第11行“datArr = [map(float,line) for line in stringArr]”中的map()函数的用法变了,在Python2中map()函数返回列表,在Python3中map()函数返回迭代器,所以需要在map()函数前加上list()将结果转为列表,即只需要将pca.py的第11行代码修改为:
datArr = [list(map(float,line)) for line in stringArr]
就可以了。
分享此文,只愿后续的学者不要再踩同样的坑了,多花点时间在算法上,共勉!
阅读更多- 【机器学习实战】第13章 利用 PCA 来简化数据
- 【机器学习实战】第13章 利用 PCA 来简化数据
- 【机器学习实战】第13章 利用 PCA 来简化数据
- 【机器学习实战-python3】利用PCA简化数据
- 《机器学习实战》学习笔记(十二)之利用PCA来简化数据
- 《机器学习实战》利用PCA来简化数据
- 《机器学习实战》笔记之十三——利用PCA来简化数据
- 《机器学习实战》读书笔记之利用PCA来简化数据
- [完]机器学习实战 第十三章 利用PCA来简化数据
- 利用arcpy解决python代码运行过程中产生的中间数据
- py2.7《机器学习实战》利用PCA来简化数据
- 关于服务器数据验证,一种比较优雅简便的Python解决方法
- 《机器学习实战》笔记之十四——利用SVD简化数据
- python 安装matplotlib后运行图表时提示错误numpy版本不对的解决方法
- 利用scp将压缩打包的数据上传另一台服务器上的解决方法
- cx_freeze 打包 python 程序 缺少 vc 运行库的解决方法
- win7系统运行python提示缺少api-ms-win-crt等dll解决方法
- 机器学习第十三章:利用PCA来简化数据
- Matlab自带PCA程序princomp Training & Testing及高维数据解决方法
- windows Git Bash 无法运行python文件的解决方法