首页 > 解决方案 > 形状未对齐:Scipy 的 fmin_tnc 函数

问题描述

我正在尝试自己解决第二个练习的第一部分(逻辑回归):https ://github.com/jdwittenauer/ipython-notebooks 。

result计算变量时我被卡住了。这是错误消息的最后一部分:

File "<ipython-input-51-39288db7a045>", line 55, in ComputeCost
    h=sigmoid(np.dot(X,theta))

  File "<__array_function__ internals>", line 6, in dot

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

这是我的一段代码(对不起,我的编程技能很差,我是初学者):

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scipy.optimize as opt
data=pd.read_csv('ex2data1.txt', names=['exam1','exam2','admitted'])
def sigmoid(z):
    g=1/(1+np.exp(-z))
    return g
def whichisy(data, col):
    if not isinstance(data, pd.DataFrame):
        raise ValueError('Data is not a pandas DataFrame')
    y=data.iloc[:,col]
    X=data.drop(columns=data.columns[col])
    X.insert(0,'Ones', 1)
    X=np.array(X)
    y=np.array(y)
    y=np.reshape(y, (len(y),1))
    return X,y
X,y=whichisy(data,2)

def ComputeCost(X, y, theta):
    h=sigmoid(np.dot(X,theta))
    cost=1/len(y)*np.sum(-y*np.log(h)-(1-y)*np.log(1-h))
    return cost

def Gradient(X, y, theta):
    g=np.zeros(len(theta))
    prodotto=sigmoid(np.dot(X,theta))-y
    for k in range(len(theta)):
        g[k]=1/len(y)*np.sum(prodotto*np.reshape(X[:,k],(len(X),1)))
    return g

theta=np.zeros([np.shape(X)[1],1])
result=opt.fmin_tnc(ComputeCost, theta, fprime=Gradient, args=(X,y))

我看到并理解了本练习的解决方案中的代码,但我想使用我的版本来解决它,但我不明白我错在哪里。

我没有成功地尝试展平我的梯度函数的返回值(如此处建议的矩阵未对齐错误:Python SciPy fmin_bfgs)和“y”数组(如何在 scipy.optimize 中使用 fmin_cg 正确获取维度)。

谢谢!

编辑1:在定义和函数theta时作为第一个参数放置后,函数运行但最小化失败。ComputeCostGradientfmin_tnc

result=opt.fmin_tnc(ComputeCost, theta, Gradient, args=(X,y))

并返回:(array([4.60628149e-05, 5.53178320e-03, 5.18798215e-03]), 45, 4). 所以 rc (返回代码)不是应该的 1 。

我还尝试运行result=opt.minimize(ComputeCost, theta, method='TNC', jac=Gradient, args=(X,y))以检查问题是否出在fmin_tnc函数中,但返回的值是相同的。

标签: pythonnumpylogistic-regressionscipy-optimize

解决方案


尝试将“theta”移动到“X”和“y”def之前ComputeCostGradient 例如

def ComputeCost(theta, X, y):
    # adjust the parameters in your code accordingly
    ...

推荐阅读