Tôi nghĩ rằng mã của bạn hơi phức tạp và cần nhiều cấu trúc hơn, vì nếu không bạn sẽ bị mất trong tất cả các phương trình và hoạt động. Cuối cùng hồi quy này nắm để bốn hoạt động:
- Tính giả thuyết h = X * theta
- Tính mất = h - y và có thể chi phí bình phương (lỗ^2)/2m
- tính gradient = X' * mất/m
- cập nhật các thông số theta = theta - alpha * gradient
Trong trường hợp của bạn, tôi đoán bạn đã nhầm lẫn m
với n
. Ở đây m
biểu thị số lượng ví dụ trong tập huấn luyện của bạn, không phải số lượng đối tượng địa lý.
Hãy có một cái nhìn tại sự thay đổi của tôi về mã của bạn:
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)
Lúc đầu, tôi tạo ra một tập dữ liệu ngẫu nhiên nhỏ mà nên xem xét như thế này:
Như bạn có thể thấy tôi cũng đã thêm dòng hồi quy được tạo ra và công thức được tính bằng excel.
Bạn cần phải quan tâm đến trực giác của hồi quy bằng cách sử dụng độ dốc gốc. Khi bạn thực hiện một đợt hoàn thành vượt qua dữ liệu X của mình, bạn cần phải giảm m-loss của mỗi ví dụ xuống một bản cập nhật trọng lượng duy nhất. Trong trường hợp này, đây là mức trung bình của tổng trên các gradient, do đó chia cho m
.
Điều tiếp theo bạn cần quan tâm là theo dõi sự hội tụ và điều chỉnh tốc độ học tập. Cho rằng vấn đề bạn nên luôn luôn theo dõi chi phí của bạn mỗi lần lặp lại, thậm chí có thể âm mưu nó.
Nếu bạn chạy ví dụ của tôi, theta trả lại sẽ trông như thế này:
Iteration 99997 | Cost: 47883.706462
Iteration 99998 | Cost: 47883.706462
Iteration 99999 | Cost: 47883.706462
[ 29.25567368 1.01108458]
Đó là thực sự khá gần với phương trình đó đã được tính toán bằng excel (y = x + 30). Lưu ý rằng khi chúng ta chuyển thiên vị vào cột đầu tiên, giá trị theta đầu tiên biểu thị trọng số thiên vị.
dấu chấm phẩy bị bỏ qua trong python và thụt đầu dòng nếu cơ bản. –