2017-10-05 9 views
0

私は、 numpyを使用して、Pythonでベクトル化されたロジスティック回帰を実装しようとしています。私の費用関数(CF)はうまくいくようです。しかし、勾配計算には の問題があります。 は3x1を返しますが、3x100配列を返します。私は(hypo-y)の部分に問題があると思う。Python Numpy Logistic Regression

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

def CF(theta,X,y): 
    m=len(y) 
    hypo=sigmoid(np.matmul(X,theta)) 
    J=(-1./m)*((np.matmul(y.T,np.log(hypo)))+(np.matmul((1-y).T,np.log(1-hypo)))) 
    return(J) 

def gr(theta,X,y): 
    m=len(y) 
    hypo=sigmoid(np.matmul(X,theta)) 

    grad=(1/m)*(np.matmul(X.T,(hypo-y))) 

    return(grad) 

X 100x3 arrray、yは100x1、およびthetaは3×1 arrrayです。

optim = minimize(CF, theta, method='BFGS', jac=gr, args=(X,y)) 

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

+1

例入力でどのように関数を呼び出すかを示してください。私は、これが結果の形状と関係があると思います。 – kazemakase

+0

私のX入力は100X3Arrray、y入力は100X1、theta入力は3X1Arrrayです。この最適化関数はエラーを返す:optim = minimal(CF、theta、method = 'BFGS'、jac = gr、args =(X、y))エラー: "ValueError:shapes(3,100 )and(3,100)not aligned:100(dim 1)!= 3(dim 0) "ありがとうございました! – efeatikkan

答えて

0

I think there is a problem with the (hypo-y) part.

スポットに:それは両方の機能を個別に作業しているようだ、しかし、この最適化機能は、エラーになります!

hypoの形状は、(100,)であり、yの形状は、(100, 1)である。要素別の-操作では、hypoがnumpyのbroadcasting rulesに従って(1, 100)の形にブロードキャストされます。その結果、(100, 100)配列になり、行列乗算が(3, 100)配列になります。

修正このyと同じ形状にhypoをもたらすことによって:

hypo = sigmoid(np.matmul(X, theta)).reshape(-1, 1) # -1 means automatic size on first dimension 

問題がもう一つあります:scipy.optimize.minimizeは(私はあなたが使用していると仮定した)勾配は形状(k,)の配列であることを期待はなく、関数grは、形のベクトル(k, 1)を返します。これは、修正するのは簡単です:

return grad.reshape(-1) 

最後の関数が

def gr(theta,X,y): 
    m=len(y) 
    hypo=sigmoid(np.matmul(X,theta)).reshape(-1, 1) 
    grad=(1/m)*(np.matmul(X.T,(hypo-y))) 
    return grad.reshape(-1) 

とおもちゃのデータ作品(私は数学や結果の妥当性をチェックしていない)でそれを実行している次のようになります。

theta = np.reshape([1, 2, 3], 3, 1)  
X = np.random.randn(100, 3) 
y = np.round(np.random.rand(100, 1))  

optim = minimize(CF, theta, method='BFGS', jac=gr, args=(X,y)) 
print(optim) 
#  fun: 0.6830931976615066 
# hess_inv: array([[ 4.51307367, -0.13048255, 0.9400538 ], 
#  [-0.13048255, 3.53320257, 0.32364498], 
#  [ 0.9400538 , 0.32364498, 5.08740428]]) 
#  jac: array([ -9.20709950e-07, 3.34459058e-08, 2.21354905e-07]) 
# message: 'Optimization terminated successfully.' 
#  nfev: 15 
#  nit: 13 
#  njev: 15 
# status: 0 
# success: True 
#  x: array([-0.07794477, 0.14840167, 0.24572182]) 
+0

ありがとう、それは今作動する!! – efeatikkan