python学习-----bug记录

本文针对《机器学习实战》一书中K-Means算法的Python2代码,在Python3环境中运行时出现的各种错误进行了详细的分析和解决。包括TypeError、AttributeError、ValueError等多种错误类型,并提供了具体的解决方案。
摘要由CSDN通过智能技术生成

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值