python问题:ValueError: operands could not be broadcast together with shapes (100,3) (3,1)

  • Post author:
  • Post category:python


原文链接:http://www.mamicode.com/info-detail-1072145.html


背景:

dataMatrix是(100,3)的列表,labelMat是(1,100)的列表,weights是(3,1)的数组,属性如下代码所示:

>>> import types
>>> type(dataMatrix)
<type ‘list‘>
>>> type(labelMat)
<type ‘list‘>
>>> type(weights)
<type ‘numpy.ndarray‘>


我的代码:

>>> dataMatrix=dataArr
>>> labelMat=labelMat.transpose()
>>> m,n=shape(dataMatrix)
>>> alpha=0.001
>>> maxCycles=500
>>> weights=ones((n,1))
>>> for k in range(maxCycles):
...     h=logRegres.sigmoid(dataMatrix*weights)
...     error=(labelMat-h)
...     weights=weights+alpha*dataMatrix.transpose()*error



错误信息:





Traceback (most recent call last):


File “<stdin>”, line 2, in <module>


ValueError: operands could not be broadcast together with shapes (100,3) (3,1)


解释:

本人出现的问题是,dataMatrix,weights的大小分别为(100,3) (3,1), 是<type ‘list‘>、<numpy.ndarray>类型,而不是<matrix>类型,直接进行乘积C = A*B, 之后,提示上述错误,原因是数组大小“不一致”, 解决方案,不用”*”符号,使用numpy中的dot()函数,可以实现两个二维数组的乘积,或者将数组类型转化为矩阵类型,使用”*”相乘,具体如下:

第一种方法:

>>> dataMatrix=dataArr


>>> labelMat=labelMat.transpose()


>>> m,n=shape(dataMatrix)


>>> alpha=0.001


>>> maxCycles=500


>>> weights=ones((n,1))

>>> for k in range(maxCycles):


…     h=logRegres.sigmoid(

dot(dataMatrix,weights)

)


…     error=(labelMat-h)


…     weights=weights+alpha*dataMatrix.transpose()*error





Traceback (most recent call last):


File “<stdin>”, line 4, in <module>


AttributeError: ‘list‘ object has no attribute ‘transpose‘




分析:这次没有出现上次的错误,但是这次出现的错误是指‘list‘没有‘transpose‘转置功能,我们知道只有矩阵才有转置。所以用第二种方法,直接将dataMatrix,weights都转换为矩阵,代码如下:

第二种方法:

>>>

dataMatrix=mat(dataArr)



>>>

labelMat=mat(labelMat)



>>> m,n=shape(dataMatrix)


>>> alpha=0.001


>>> maxCycles=500


>>> weights=ones((n,1))


>>> for k in range(maxCycles):


…     h=logRegres.sigmoid

(dataMatrix*weights)



…     error=(labelMat-h)


…     weights=weights+alpha*dataMatrix.transpose()*error





>>>


这次没有出现错误,解决了刚才的问题。