Python:ValueError: 形状 (3,) 和 (118,1) 未对齐:3 (dim 0) != 118 (dim 0)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28735344/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 03:40:08  来源:igfitidea点击:

Python:ValueError: shapes (3,) and (118,1) not aligned: 3 (dim 0) != 118 (dim 0)

pythonnumpyscipy

提问by Sahil Dahiya

I am trying to do logistic regression using fmin but there is an error showing up due to different shapes of array. Here is the code.

我正在尝试使用 fmin 进行逻辑回归,但由于数组形状不同,出现错误。这是代码。

import numpy as np

import scipy.optimize as sp

data= #an array of dim (188,3)

X=data[:,0:2]
y=data[:,2]
m,n=np.shape(X)
y=y.reshape(m,1)
x=np.c_[np.ones((m,1)),X]
theta=np.zeros((n+1,1))


def hypo(x,theta): 
    return np.dot(x,theta)

def sigmoid(z):
    return 1/(1+np.exp(-z))

def gradient(x,y,theta):#calculating Gradient
    m=np.shape(x)[0]
    t=hypo(x,theta)
    hx=sigmoid(t)
    J=-(np.dot(np.transpose(np.log(hx)),y)+np.dot(np.transpose(np.log(1-hx)),(1-y)))/m
    grad=np.dot(np.transpose(x),(hx-y))/m
    J= J.flatten()
    grad=grad.flatten()
    return J,grad

def costFunc(x,y,theta):    
    return gradient(x,y,theta)[0]

def Grad():
   return gradient(x,y,theta)[1]

sp.fmin( costFunc, x0=theta, args=(x, y), maxiter=500, full_output=True)

error that is showing

显示的错误

File "<ipython-input-3-31a0d7ca38c8>", line 35, in costFunc

return gradient(x,y,theta)[0]

File "<ipython-input-3-31a0d7ca38c8>", line 25, in gradient

t=hypo(x,theta)

File "<ipython-input-3-31a0d7ca38c8>", line 16, in hypo

return np.dot(x,theta)

ValueError: shapes (3,) and (118,1) not aligned: 3 (dim 0) != 118 (dim 0)

Any kind of help will be appreciated

任何形式的帮助将不胜感激

采纳答案by hpaulj

data= #an array of dim (188,3)

X=data[:,0:2]
y=data[:,2]
m,n=np.shape(X)
y=y.reshape(m,1)
x=np.c_[np.ones((m,1)),X]
theta=np.zeros((n+1,1))

so after this

所以在这之后

In [14]: y.shape
Out[14]: (188, 1)   # is this (118,1)?
In [15]: x.shape
Out[15]: (188, 3)
In [16]: theta.shape
Out[16]: (3, 1)

This xand thetacan dotted- np.dot(x,theta), and (188,3) with (3,1) - matching the 3's.

xtheta可以dotted- np.dot(x,theta),和 (188,3) 与 (3,1) - 匹配 3。

But that's not what your costFuncis getting. Tracing back from the error message it looks like xis (3,), and thetais (118,1). which obviously cannot be dotted.

但这不是你costFunc得到的。从错误消息中回溯它看起来x(3,),并且theta(118,1)。这显然不能dotted

You need to review how fmincalls your function. Do you have the parameters in the right order? For example, maybe costFunc(theta, x, y)is the correct order (assuming the xand yin costFuncare meant to match with the args=(x,y).

您需要查看如何fmin调用您的函数。你有正确顺序的参数吗?例如,也许costFunc(theta, x, y)是正确的顺序(假设xyincostFunc意在与args=(x,y).

The docs for fmininclude:

文档fmin包括:

func : callable func(x,*args)
    The objective function to be minimized.
x0 : ndarray
    Initial guess.
args : tuple, optional
    Extra arguments passed to func, i.e. ``f(x,*args)``.
func : callable func(x,*args)
    The objective function to be minimized.
x0 : ndarray
    Initial guess.
args : tuple, optional
    Extra arguments passed to func, i.e. ``f(x,*args)``.

It looks like fminis feeding your costFunc3 arguments, corresponding in size to your (theta, x, y), i.e. (3,), (118,3), (118,1). The numbers don't quite match, but I think you get the idea. The first argument to consFuncis the one that the fminwill vary, the rest you provide in args.

看起来像是fmin在提供您的costFunc3 个参数,它们的大小对应于您的(theta, x, y), 即(3,), (118,3), (118,1)。数字不太匹配,但我想你明白了。第一个参数consFuncfmin将变化的,其余的你在args.