首页 > 解决方案 > 梯度下降曲线拟合

问题描述

我写了一些对几个数据点执行梯度下降的代码。由于某种原因,曲线没有正确收敛,但我不知道为什么会这样。我总是以爆炸的尾巴结束。

我做错了其中一个计算吗?我真的陷入了局部最小值还是其他什么?

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

def estimate(weights, x, order):
    est = 0
    for i in range(order):
        est += weights[i] * x ** i
    return est

def cost_function(x, y, weights, m):
    cost = 0
    for i in range(m-1):
        cost += (((weights[i] * x ** i) - y) ** 2)
    return (np.sum(cost ** 2) / ( 2 * m ))

def descent(A, b, iterations, descent_rate, order):
    x = A.T[0]
    y = b.reshape(4)

    # features
    ones = np.vstack(np.ones(len(A)))
    x = np.vstack(A.T[0])
    x2 = np.vstack(A.T[0] ** 2)

    # Our feature matrix
    features = np.concatenate((ones,x,x2), axis = 1).T
    # Initialize our coefficients to zero
    weights = np.zeros(order + 1)
    m = len(y)

    # gradient descent
    for i in range(iterations):
        est = estimate(weights, x, order).T
        difference = est - y
        weights = weights + (-descent_rate * (1/m) * np.matmul(difference, features.T)[0])
        cost = cost_function(x, y, weights, m)
        print(cost)

    plt.scatter(x,y)
    u = np.linspace(0,3,100)
    plt.plot(u, (u ** 2) * weights[2] + u  * weights[1] + weights[0], '-')
    plt.show()

A = np.array(((0,1),
             (1,1),
             (2,1),
             (3,1)))

b = np.array((1,2,0,3), ndmin = 2 ).T

iterations = 150
descent_rate = 0.01
order = 2
descent(A, b, iterations, descent_rate, order)

我想避免陷入这样的最低限度。我尝试将初始权重设置为随机值,但无济于事,有时它会下降一点,但随后又给了我相同的行为。

这是我得到的情节之一: 在此处输入图像描述

这是通过最小二乘解获得的预期结果:

在此处输入图像描述

标签: pythonnumpyregressioncurve-fittinggradient-descent

解决方案


你的estimate功能应该是

def estimate(weights, x, order):
    est = 0
    for i in range(order+1):
        est += weights[i] * x ** i
    return est

更好的是,由于订单信息已经存在于weights向量的大小中,因此删除冗余:

def estimate(weights, x):
    est = 0
    for i in range(len(weights)):
        est += weights[i] * x ** i
    return est

这是我在使用您的代码并运行 2000 次迭代时得到的结果: 在此处输入图像描述


推荐阅读