Myślę, że twój kod jest nieco zbyt skomplikowany i potrzebuje więcej struktury, ponieważ w przeciwnym razie stracisz wszystkie równania i operacje. W końcu ten regresji sprowadza się cztery operacje:
- Oblicz hipotezy h = X * teta
- Obliczenie strat = h - Y i może kwadratu kosztów (strata^2)/2M
- obliczyć gradient = X”* utrata/m
- Aktualizacja parametry theta = theta - alfa * Gradient
W twoim przypadku, myślę, że masz mylić m
z n
. Tutaj m
oznacza liczbę przykładów w twoim zestawie treningowym, a nie liczbę funkcji.
Rzućmy okiem na moje zmianę kodu:
import numpy as np
import random
# m denotes the number of examples here, not the number of features
def gradientDescent(x, y, theta, alpha, m, numIterations):
xTrans = x.transpose()
for i in range(0, numIterations):
hypothesis = np.dot(x, theta)
loss = hypothesis - y
# avg cost per example (the 2 in 2*m doesn't really matter here.
# But to be consistent with the gradient, I include it)
cost = np.sum(loss ** 2)/(2 * m)
print("Iteration %d | Cost: %f" % (i, cost))
# avg gradient per example
gradient = np.dot(xTrans, loss)/m
# update
theta = theta - alpha * gradient
return theta
def genData(numPoints, bias, variance):
x = np.zeros(shape=(numPoints, 2))
y = np.zeros(shape=numPoints)
# basically a straight line
for i in range(0, numPoints):
# bias feature
x[i][0] = 1
x[i][1] = i
# our target variable
y[i] = (i + bias) + random.uniform(0, 1) * variance
return x, y
# gen 100 points with a bias of 25 and 10 variance as a bit of noise
x, y = genData(100, 25, 10)
m, n = np.shape(x)
numIterations= 100000
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)
w pierwszej chwili stworzyć mały losowy zbiór danych, który powinien wyglądać tak:

Jak widać I dodano również wygenerowaną linię regresji i formułę obliczoną przez Excel.
Musisz dbać o intuicję regresji za pomocą gradientowego zniżania. Gdy wykonasz pełne przetwarzanie wsadowe danych X, musisz zmniejszyć m-straty każdego przykładu do pojedynczej aktualizacji wagi. W tym przypadku jest to średnia z sumy na gradientach, a więc podział przez m
.
Następną rzeczą, na którą należy zwrócić uwagę, jest śledzenie zbieżności i dostosowanie szybkości uczenia się. Jeśli o to chodzi, zawsze powinieneś śledzić swój koszt w każdej iteracji, a może nawet spiskuj.
Jeśli uruchomić mój przykład, theta zwrócony będzie wyglądać następująco:
Iteration 99997 | Cost: 47883.706462
Iteration 99998 | Cost: 47883.706462
Iteration 99999 | Cost: 47883.706462
[ 29.25567368 1.01108458]
Która jest całkiem blisko do równania, które zostały obliczone przez program Excel (y = x + 30). Zwróć uwagę, że kiedy przekazywaliśmy wartość odchylenia do pierwszej kolumny, pierwsza wartość theta oznacza wagę obciążenia.
średnik są ignorowane w python i wcięcia, jeśli są zasadnicze. –