• 【python问题系列--4】ValueError: operands could not be broadcast together with shapes (100,3) (3,1)


    背景: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
    ...
    >>>
    这次没有出现错误,解决了刚才的问题。

  • 相关阅读:
    丸内の霊 補充4
    丸内の霊 補充3
    丸内の霊 補充2
    N1 语法单词
    完全掌握1级日本与能力考试语法问题对策
    丸の内の霊 補充1
    丸内の霊 8
    丸内の霊   7
    丸内の霊  6
    丸の内の霊 6
  • 原文地址:https://www.cnblogs.com/chamie/p/4865425.html
Copyright © 2020-2023  润新知