特征归一化会影响梯度下降吗?线性回归

数据挖掘 机器学习 线性回归 机器学习模型 梯度下降 特征缩放
2022-02-11 16:08:41

我是数据科学的新手,我想学习线性回归,所以我从头开始编写线性回归并执行梯度下降以找到最好的wθbθ值使用教程。一切都很好,我找到了最好的wθ,bθ值,我绘制了最佳拟合线(下图)。

站立前

还有我用来找到的梯度下降代码wθ,bθ值低于。

def step_gradient_descent(data,m,b,learning_rate=0.0001):
        b_gradient= m_gradient = 0
        N=float(len(data))
        for i in range(len(data)):
                [x,y]=data[i]
                y_=(m*x)+b
                m_gradient+= - (2/N)*(x*(y-y_))
                b_gradient+= -(2/N)*(y-y_)
        #print("m ={}, b ={}".format(m_gradient,b_gradient))
        m_new = m-(learning_rate*m_gradient)
        b_new = b-(learning_rate*b_gradient)
        return (m_new,b_new)

def perform_gradient_descent(data,m,b,lr=0.0001,epochs=1000):
        m_array=b_array=[]
        for i in range(epochs):
                if(i % 100 == 0 ):
                        print("Running {}/{}".format(i,epochs))
                (m,b) = step_gradient_descent(data,m,b,lr)
        return (m,b,m_array,b_array)

然后我执行了特征标准化/标准化x,y以下

def featureNormalize(data):
    mean = np.mean(data , axis=0 )
    std = np.std(data , axis=0 )
    norm = ( data - mean ) / std
    return norm

然后我绘制了最佳拟合线,这与上面绘制的不同。 特征归一化后

所以我试图像以前一样恢复之前的最佳拟合线的

  • 改变学习率(r)
  • 变化的时代(n)

没有成功。所以我的理解是特征归一化/标准化不应该对梯度下降产生任何影响,但在这种情况下并没有发生。只是想知道我的情况发生了什么。

链接到我的笔记本

提前致谢。

2个回答

标准归一化让梯度下降收敛更快这就是大多数情况下应用归一化的原因(当然它也消除了不同尺度特征值的影响)。

在这个quora主题中,它得到了很好的解释。

你的学习率非常小。我认为没有足够的迭代次数来覆盖局部最小值。这张图很好地解释了学习率对梯度下降的影响:

在此处输入图像描述

您可能想检查我的另一个答案。

我只需要执行 L2 标准化,它就像魅力一样。

理论解释:

wθ=2N(x(y(mx+b)))+λ2mi=1nθi2bθ=2N(y(mx+b))+λ2mi=1nθi2

代码更改:

def step_gradient_descent_reg(data,m,b,learning_rate=0.0001,_lambda=1):
        b_gradient= m_gradient = 0
        N=float(len(data))
        for i in range(len(data)):
                [x,y]=data[i]
                y_=(m*x)+b
                m_gradient+= - ( (2/N)*(x*(y-y_)) ) + ( (_lambda / 2 * m ) * (np.sum(np.square(m_gradient))) )
                b_gradient+= - (2/N)*(y-y_)  + ( (_lambda / 2 * m ) * (np.sum(np.square(m_gradient))) )
        #print("m ={}, b ={}".format(m_gradient,b_gradient))
        m_new = m-(learning_rate*m_gradient)
        b_new = b-(learning_rate*b_gradient)
        return (m_new,b_new)

def perform_gradient_descent_reg(data,m,b,lr=0.0001,epochs=1000):
        m_array=b_array=[]
        for i in range(epochs):
                if(i % 100 == 0 ):
                        print("Running {}/{}".format(i,epochs))
                (m,b) = step_gradient_descent_reg(data,m,b,lr)
                m_array.append(m)
                b_array.append(b)
        #np.array(m_array),np.array(b_array)

        plot(data,m,b)

        return (m,b,m_array,b_array)

结果我得到了我想要的正确结果。最优拟合线wθbθ最后感谢L2 Normalization技术。

在此处输入图像描述