1.TypeError: unsupported operand type(s) for -: 'map' and 'map'
这是机器学习实战实现K-Means上的代码的报的错。错误之处是:fltLine = map(float,curLine)),此后对fltLine进行了加减操作。
原因:map
方法来对从文本文件中读取的数据进行映射处理,也就是把读取到的string转换为float。这一个简单的类型转换按照书上实现的方法在Python 2中不会报错。但是在Python 3中,map方法返回的是一个map对象,因此对于这个错误,解决办法很简单。
解决方法:fltLine = list(map(float,curLine))
参考:https://blog.csdn.net/zjn941213/article/details/78176073
2.AttributeError: module 'random' has no attribute 'rand'
报错的具体地方:centroids[:,j] = minJ + rangeJ * random.rand(k,1)
用书上代码实现K-Means的时候,由于书上的代码使用的是Python2,因此使用numpy时,全部都没有按照np.方式,而是直接写方法,这在Python3中会报错。只需要在random.rand(k,1)前面加上np.就行了。
解决方法:centroids[:,j] = minJ + rangeJ * np.random.rand(k,1)
3.ValueError: Masked arrays must be 1-D
具体报错的地方: for cent, c, marker in zip(range(k),['r','g','b','y'],['^','o','*','s']):
ax.scatter(data[cent][:, 0], data[cent][:, 1], s=80, c=c, marker=marker)
ax.scatter(centroids[:, 0], centroids[:, 1], s=1000, c='black', marker='+', alpha=1) #画出质心点
查找资料说是,在绘制散点图时需要先把矩阵转换成list,进行如下更改即可。
解决办法:for cent, c, marker in zip(range(k),['r','g','b','y'],['^','o','*','s']):
ax.scatter(data[cent][:, 0].tolist(), data[cent][:, 1].tolist(), s=80, c=c, marker=marker)
ax.scatter(centroids[:, 0].tolist(), centroids[:, 1].tolist(), s=1000, c='black', marker='+', alpha=1) #画出质心点
参考:https://blog.csdn.net/feixiang5527/article/details/78840840
4.TypeError: only length-1 arrays can be converted to Python scalars
这类错误一般说的是对数组操作的方法不能直接对数操作,math库里的东西不能直接作用在ndarray上,例如:
import numpy as np
import math
vector = np.arange(1,10)
result = math.log10(vector)
或者
num = float(vector_a*vector_b.T)
解决办法,将函数矢量化(推荐)、循环计算或者去掉没必要的一些操作
result = np.vectorize(math.log10)(evctor) #向量化
num = vector_a*vector_b.T #去掉对强制矩阵元素为float
5.ValueError: math domain error
遇到的这个错误记录一下,说的是某些操作不符合数学定义,负数取对数、负数开平方等
6.TypeError: unsupported operand type(s) for /: 'int' and 'dict_values'
出错的代码是:
def tf(word, count):
return count[word] / sum(count.values())
count是个字典,我的运行环境是Python3 ,查阅资料发现,在Python2中:
w={
'a':1,
'b':2,
'c':3
}
b={
'aa':4,
'bb':5,
'cc':6
}
r=w.values()+b.values()
print(r)
得到的是一个列表 list
在Python3中这样则会报错,解决办法是将字典强制类型转换为list:
def tf(word, count):
return count[word] / sum(list(count.values()))
这样就可以解决问题了!
7.AttributeError: module 'jieba' has no attribute 'cut'
不要把将运行的文件命名为jieba.py,也不要在工程文件下有jieba.py文件,自己撸自己当然会出错。
8.UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 5572758: illegal multibyte sequence
对于Python来说这个错误真是出现太多次了,每次都要上谷歌查找。现总结如下,这个问题的原因是因为在原中文文本中出现了对于‘gbk’之外的字符,即可认为是中文的乱码,是无法通过‘gbk’解码的。
按照网上说的open(filename,'r','utf-8')或者open(filename,'r','gbk')并不能解决任何问题,想想也对,问题是出在原文件中,但我们又不能去找到原文件中编码不对的地方,看到有的人是在文本中删掉不一致的地方,但对于长文本这显然是不适合的。
一种有效的解决方法是:以二进制的方式读取文件,然后将文件特定编码进行解码,忽略或者代替解码不一致的地方。
with open('xyj.txt','rb') as f:
text = f.read().decode('gbk','ignore')
如上的操作就不会再报错了。
9.ValueError: Only call `softmax_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)
这是使用TensorFlow时的一个错误,
原来这个函数,不能按以前的方式进行调用了,只能使用命名参数的方式来调用。原来是这样的:
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(predict, Y))
因此修改需要成这样:
tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=Y, labels=predict))