Я пытаюсь реализовать многоклассовый логистический регрессионный классификатор, который различает k
разных классов.деление python на ноль встречается в лог-логистической регрессии
Это мой код.
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)
можно проверить, что стоимость и градиент возврата значений, которые находятся в правильном измерении (стоимость возвращает скаляр, и градиент возвращает 1 по п вектора-строки), но я получаю ошибку
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 so' (regTerm/(2 * m)) ', а'/m' станет делением на 0. – Munir
m не равно 0, это 4104 в моем случае. –