【问题标题】:Linear Regression with Gradient Descent in Python with numpyPython中带有梯度下降的线性回归与numpy
【发布时间】:2018-03-31 20:15:16
【问题描述】:

我正在尝试用 Python 实现 Andrew NG 的 Coursera 机器学习课程的第一个练习。在课程中,练习使用 Matlab/Octave,但我也想在 Python 中实现它。

问题是更新 theta 值的行似乎无法正常工作,正在返回值[[0.72088159] [0.72088159]] 但应该返回 [[-3.630291] [1.166362]]

我使用的学习率为 0.01,梯度循环设置为 1500(与 Octave 中原始练习的值相同)。

显然,对于这些错误的 theta 值,预测不正确,如上一张图表所示。

在我 tesyo 的行中,theta 值定义为 [0; 0] 和 [-1; 2],结果是正确的(与Octave中的练习相同),所以错误只能在梯度的函数中,但我不知道哪里出错了。

我希望有人帮我找出我做错了什么。我已经很感激了。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

def load_data():
    X = np.genfromtxt('data.txt', usecols=(0), delimiter=',', dtype=None)    
    y = np.genfromtxt('data.txt', usecols=(1), delimiter=',', dtype=None)    
    X = X.reshape(1, X.shape[0])
    y = y.reshape(1, y.shape[0])
    ones = np.ones(X.shape)
    X = np.append(ones, X, axis=0)
    theta = np.zeros((2, 1))

    return (X, y, theta)


alpha = 0.01         
iter_num = 1500      
debug_at_loop = 10

def plot(x, y, y_hat=None):

    x = x.reshape(x.shape[0], 1)

    plt.xlabel('x')
    plt.ylabel('hΘ(x)')
    plt.ylim(ymax = 25, ymin = -5)
    plt.xlim(xmax = 25, xmin = 5)
    plt.scatter(x, y)

    if type(y_hat) is np.ndarray:
        plt.plot(x, y_hat, '-')

    plt.show()

plot(X[1], y)

def hip(X, theta):
    return np.dot(theta.T, X)

def cost(X, y, theta):
    m = y.shape[1]

    return np.sum(np.square(hip(X, theta) - y)) / (2 * m)

print('With theta = [0 ; 0]')
print('Cost computed =', cost(X, y, np.array([0, 0])))
print()
print('With theta = [-1 ; 2]')
print('Cost computed =', cost(X, y, np.array([-1, 2])))

def grad(X, y, alpha, theta, iter_num=1500, debug_cost_at_each=10):

    J = []
    m = y.shape[1]

    for i in range(iter_num):

        theta -= ((alpha * 1) / m) * np.sum(np.dot(hip(X, theta) - y, X.T))

        if i % debug_cost_at_each == 0:

            J.append(round(cost(X, y, theta), 6))

    return J, theta

X, y, theta = load_data()

J, fit_theta = grad(X, y, alpha, theta)

print('Theta found by Gradient Descent:', fit_theta)

# Predict values for population sizes of 35,000 and 70,000
predict1 = np.dot(np.array([[1], [3.5]]).T, fit_theta);
print('For population = 35,000, we predict a profit of \n', predict1 * 10000);

predict2 = np.dot(np.array([[1], [7]]).T, fit_theta);
print('For population = 70,000, we predict a profit of \n', predict2 * 10000);

pred_y = hip(X, fit_theta)
plot(X[1], y, pred_y.T)

我使用的数据是以下txt:

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705

【问题讨论】:

  • 帮我一个忙,如果您投反对票,请告诉我这个问题有什么问题,因为我看不出有任何原因。
  • 我怀疑人们之所以拒绝投票是因为您发布了代码照片,而不是代码本身。人们想尝试重新创建您的问题来帮助您,但没有人想重新输入您的代码。在此处查看有关提出更好问题的建议:stackoverflow.com/help/mcve
  • 我无法让 Python 执行发布的代码截图图像。
  • 请阅读how to make good reproducible pandas examples并相应地编辑您的帖子。
  • 发帖前想了想,但我觉得会是很多代码,我发现图像更好,我什至没有想到有人会想要运行代码。

标签: python numpy machine-learning linear-regression


【解决方案1】:

好吧,我是在掉了几根头发后才得到的(编程仍然会让我秃顶)。

在渐变线上,解决方法是这样的:

theta -= ((alpha * 1) / m) * np.dot(X, (hip(X, theta) - y).T)

我改变了X的位置并转置了误差向量。

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2019-10-09
    相关资源
    最近更新 更多