【问题标题】:What is wrong in this Python code for Regularized Linear Regression?这个用于正则化线性回归的 Python 代码有什么问题?
【发布时间】:2013-07-15 19:54:33
【问题描述】:

我用 numpy 写了代码(theta, X 是 numpy 数组):

def CostRegFunction(X, y, theta, lambda_):
    m = len(X)
    # add bias unit
    X = np.concatenate((np.ones((m,1)),X),1)

    H = np.dot(X,theta)

    J = (1 / (2 * m)) * (np.sum([(H[i] - y[i][0])**2 for i in range(len(H))])) + (lambda_ / (2 * m)) * np.sum(theta[1:]**2)

    grad_ = list()

    grad_.append((1 / m) * np.sum([(H[j] - y[j][0]) for j in range(len(H))]))
    for i in range(len(theta)-1):
        grad_.append((1 / m) * np.sum([(H[j] - y[j]) * X[j][i+1] for j in range(len(H))]) + (lambda_ / m) * theta[i+1])

    return J, grad_



def TrainLinearReg(X, y, theta, lambda_, alpha, iter):

    JHistory = list()
    for i in range(iter):
        J, grad = CostRegFunction(X, y, theta, Lambda_)
        JHistory.append(J)
        for j in range(len(theta)):
            theta[j] = theta[j] - alpha * grad[j]

    return theta, JHistory

Theta, JH = TrainLinearReg(X, y, th, Lambda_, 0.01, 50)

但是当我尝试学习 theta 时,这段代码让我的 theta 和 J 值有了非常大的增长。 例如第一次迭代 grad = [-15.12452, 598.435436] - 这是正确的。 J 是 303.3255 第二次迭代 - grad = [10.23566,-3646.2345] J = 7924 以此类推,J 增长得越来越快,但在 LR 的概念上,它必须更低。

但如果我使用正态线性方程,我会得到一个很好的 Theta。

那段代码有什么问题?

【问题讨论】:

  • 您检查过各种alpha 值吗?
  • 是的.. 我之前尝试过 alpha = 0.001,但它在每次迭代时给了我恒定的 J = 141。但我现在尝试了 varios 值,它给了我正确的答案!(alpha = 0.001)我是想知道,真的。也许我发现了一个错误并修复它,但不再尝试 varios alpha。谢谢。
  • 你能解释一下你的回归函数是什么吗?什么是 X、Y、θ 等?每件东西的形状是什么?因为我认为对于 j in range(len(... 语句,你会使很多事情复杂化

标签: python algorithm numpy machine-learning linear-regression


【解决方案1】:

numpy 版本

。 10月17日编辑

我使用 numpy 库重写了部分代码。

所有向量现在都是列 numpy 数组。

import numpy as np
from copy import deepcopy as dc
from matplotlib import pyplot as plt

_norm = np.linalg.norm    

def CostRegFunction(X, y, theta, lambda_):
    m = len(X)
    H = np.dot(X,theta)
    J = (1 / (2 * m)) * _norm(H-y)**2 + (lambda_ / (2 * m)) * _normal(theta[1:])**2
    grad_ = np.array(sum(H-y)/m,ndmin=2).T
    for i in range(theta.shape[0]-1):
        grad_=np.concatenate((grad_,np.array(sum((H-y)*np.array(X[:,1],ndmin=2).T)/m + (lambda_/m) * theta[i+1],ndmin=2).T),0)
    return J, grad_

def TrainLinearReg(X, y, theta, lambda_, alpha, iter):
    JHistory = list()
    # add bias unit -> it's better to do it here, before entering the loop
    X = np.concatenate((np.ones((X.shape[0],1)),X),1)
    for i in range(iter):
        J, grad = CostRegFunction(X, y, theta, lambda_)
        JHistory.append(J)
        theta = theta -  alpha*grad
    return theta, JHistory

然后我生成了一组简单的带有白噪声的 x-y 多项式数据,并使用 TrainLinearRegfunction 拟合了多项式方程。

x = np.concatenate((np.array(np.linspace(0,10,100) + np.random.normal(0,0.01,100),ndmin=2).T,\
np.array(np.linspace(0,10,100)**2 + np.random.normal(0,0.01,100),ndmin=2).T),1)
y = 2 + -3*np.array(x[:,0],ndmin=2).T + np.random.normal(0,3,[100,1]) - 2*np.array(x[:,1],ndmin=2).T
th = np.array([1,2,3],ndmin=2).T
alpha = 0.001
lambda_ = 0.1
Theta, JH = TrainLinearReg(x, y, dc(th), lambda_, alpha, 10000)

我得到的是以下内容。

plt.plot(x[:,0],y,'o',label='Original Data',alpha = 0.5)
x2 = np.linspace(0,10,10)
plt.plot(x2,Theta[0]+x2*Theta[1]+x2**2*Theta[2],'-',label='Fitted     Curve',lw=1.5,alpha=0.8,color='black')
plt.gca().set_xlabel('x')
plt.gca().set_ylabel('y')
plt.legend()

Output >> Theta = array([[ 1.29259285],
                         [-2.97763304],
                         [-1.98758321]])

希望对我有所帮助。

最好的问候, 加布里埃尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2015-02-13
    相关资源
    最近更新 更多