L、Gj 发表于 2020-7-14 12:38:54

opt.fmin_tnc报错

代码部分如下
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#导入数据
data=pd.read_csv('C:\\Users\\hasee\\Desktop\\machine learning\\machine-learning-ex2\\ex2\\ex2data1.txt',
               names=['Exam1','Exam2','Admitted'])

#X与y的矩阵化,初始化thetas
data.insert(0,'ones',1)
X=np.array(data.iloc[:,:3])
y=np.array(data.Admitted).reshape(100,1)
thetas=np.zeros((3,1))

#定义函数
def sigmoid(x):
    return1/(1+np.exp(-x))

def costfunction(X,y,thetas):
   a=np.log(sigmoid(np.dot(X,thetas)))
    first=np.multiply(y,a)
    second=np.multiply((1-y),np.log(1-sigmoid(X.dot(thetas))))
    return np.sum(first+second)/(-100)

def gradient(X,y,thetas):
    length = len(y)
    s=np.empty((1,3))
    for i in range(length):
      s+=(sigmoid(X.dot(thetas)) - y) * X
    s=s.reshape(3,)
    return s/100


处理后的data长这样
    ones      Exam1      Exam2Admitted
0      134.62366078.024693         0
1      130.28671143.894998         0
2      135.84740972.902198         0
3      160.18259986.308552         1
4      179.03273675.344376         1
..   ...      ...      ...       ...
95   183.48916348.380286         1
96   142.26170187.103851         1
97   199.31500968.775409         1
98   155.34001864.931938         1
99   174.77589389.529813         1


在用scipy.optimize.fmin_tnc最小化costfunction这个函数的时候
输入代码为result = opt.fmin_tnc(func=costfunction, x0=thetas, fprime=gradient, args=(X, y))

报错说costfunction里有问题:
File "D:/Python/machine learning/ml 2.py", line 33, in costfunction
    a=np.log(sigmoid(np.dot(X,thetas)))
File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (3,) and (100,1) not aligned: 3 (dim 0) != 100 (dim 0)

可是X.shape为(100,3)thetas.shape为(3,1)
单独执行np.log(sigmoid(np.dot(X,thetas)))也是可以正常执行的



L、Gj 发表于 2020-7-14 16:17:57

本帖最后由 L、Gj 于 2020-7-14 16:31 编辑

在costfunction和gradient两个函数里一开始加了 thetas=thetas.reshape(3,1)然后把gradient里的s改成s=np.zeros((1,3)) 就成功了
页: [1]
查看完整版本: opt.fmin_tnc报错