Простая регрессия работает с рандом, но не со случайным

Прошлой ночью я написал простой двоичный код Python для логистической регрессии. Кажется, он работает правильно (вероятность увеличивается с каждой итерацией, и я получаю хорошие результаты классификации).

Моя проблема в том, что я могу только инициализировать свои веса с W = np.random.randn(n+1, 1) нормальное распределение.

Но я не хочу нормального распределения, я хочу равномерного распределения. Но когда я это делаю, я получаю ошибку

"RuntimeWarning: divide by zero encountered in log
  return np.dot(Y.T, np.log(predictions)) + np.dot((onesVector - Y).T, np.log(onesVector - predictions))"

это мой код

import numpy as np
import matplotlib.pyplot as plt

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

def predict(X, W):
    return sigmoid(np.dot(X, W))

def logLikelihood(X, Y, W):
    m = X.shape[0]
    predictions = predict(X, W)
    onesVector = np.ones((m, 1))
    return np.dot(Y.T, np.log(predictions)) + np.dot((onesVector - Y).T, np.log(onesVector - predictions))

def gradient(X, Y, W):
    return np.dot(X.T, Y - predict(X, W))

def successRate(X, Y, W):
    m = Y.shape[0]
    predictions = predict(X, W) > 0.5
    correct = (Y == predictions)
    return 100 * np.sum(correct)/float(correct.shape[0])

trX = np.load("binaryMnistTrainX.npy")
trY = np.load("binaryMnistTrainY.npy")
teX = np.load("binaryMnistTestX.npy")
teY = np.load("binaryMnistTestY.npy")

m, n = trX.shape
trX = np.concatenate((trX, np.ones((m, 1))),axis=1)
teX = np.concatenate((teX, np.ones((teX.shape[0], 1))),axis=1)
W = np.random.randn(n+1, 1)

learningRate = 0.00001
numIter = 500

likelihoodArray = np.zeros((numIter, 1))

for i in range(0, numIter):
    W = W + learningRate * gradient(trX, trY, W)
    likelihoodArray[i, 0] = logLikelihood(trX, trY, W)

print("train success rate is %lf" %(successRate(trX, trY, W)))
print("test success rate is %lf" %(successRate(teX, teY, W)))

plt.plot(likelihoodArray)
plt.show()

Если я инициализирую свой W, чтобы он был нулем или рандом, тогда это работает. Если я инициализирую его случайным (не нормальным) или единичным, то получаю деление на ноль.

Почему это происходит и как я могу это исправить?

0 ответов

Другие вопросы по тегам