私はk
異なるクラスを区別するマルチクラスロジスティック回帰分類器を実装しようとしています。Pythonはlog - logistic regressionでゼロで除算する
これは私のコードです。
import numpy as np
from scipy.special import expit
def cost(X,y,theta,regTerm):
(m,n) = X.shape
J = (np.dot(-(y.T),np.log(expit(np.dot(X,theta))))-np.dot((np.ones((m,1))-y).T,np.log(np.ones((m,1)) - (expit(np.dot(X,theta))).reshape((m,1)))))/m + (regTerm/(2 * m)) * np.linalg.norm(theta[1:])
return J
def gradient(X,y,theta,regTerm):
(m,n) = X.shape
grad = np.dot(((expit(np.dot(X,theta))).reshape(m,1) - y).T,X)/m + (np.concatenate(([0],theta[1:].T),axis=0)).reshape(1,n)
return np.asarray(grad)
def train(X,y,regTerm,learnRate,epsilon,k):
(m,n) = X.shape
theta = np.zeros((k,n))
for i in range(0,k):
previousCost = 0;
currentCost = cost(X,y,theta[i,:],regTerm)
while(np.abs(currentCost-previousCost) > epsilon):
print(theta[i,:])
theta[i,:] = theta[i,:] - learnRate*gradient(X,y,theta[i,:],regTerm)
print(theta[i,:])
previousCost = currentCost
currentCost = cost(X,y,theta[i,:],regTerm)
return theta
trX = np.load('trX.npy')
trY = np.load('trY.npy')
theta = train(trX,trY,2,0.1,0.1,4)
Iが(コストはスカラーを返し、傾きが1、n個の行ベクトルによって返さ)正しい寸法にある値を返すされるコスト及び勾配を確認することができ、私はエラーを取得
RuntimeWarning: divide by zero encountered in log
J = (np.dot(-(y.T),np.log(expit(np.dot(X,theta))))-np.dot((np.ones((m,1))-y).T,np.log(np.ones((m,1)) - (expit(np.dot(X,theta))).reshape((m,1)))))/m + (regTerm/(2 * m)) * np.linalg.norm(theta[1:])
なぜこれが起こっているのですか?これを避けるにはどうすればよいですか?
あなたの公式を見ると、mは0なので(regTerm /(2 * m)) '/ m 'は0で割り切れるようになります。 – Munir
mは0ではなく、私の場合は4104です。 –