【问题标题】:Python gradient descent not convergePython梯度下降不收敛
【发布时间】:2018-11-06 13:40:22
【问题描述】:

所以我是机器学习的新手,我一直在尝试实现梯度下降。我的代码似乎是正确的(我认为),但它并没有收敛到全局最优值。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def AddOnes(matrix):
    one = np.ones((matrix.shape[0], 1))
    X_bar = np.concatenate((one, matrix), axis=1)
    return X_bar


# Load data
df = pd.read_excel("Book1.xlsx", header=3)
X = np.array([df['Height']]).T
y = np.array([df['Weight']]).T

m = X.shape[0]
n = X.shape[1]
iterations = 30

# Build X_bar
X = AddOnes(X)

# Gradient descent
alpha = 0.00003
w = np.ones((n+1,1))
for i in range(iterations):
    h = np.dot(X, w)
    w -= alpha/m * np.dot(X.T, h-y)

print(w)

x0 = np.array([np.linspace(145, 185, 2)]).T
x0 = AddOnes(x0)
y0 = np.dot(x0, w)
x0 = np.linspace(145, 185, 2)

# Visualizing
plt.plot(X, y, 'ro')
plt.plot(x0, y0)
plt.axis([140, 190, 40, 80])
plt.xlabel("Height(cm)")
plt.ylabel("Weight(kg)")
plt.show()

Visualizing data

【问题讨论】:

  • 有什么问题?无法保证 GD 会收敛到全局最优值。
  • 达到全局最优需要你调整两个超参数:学习率 (alpha) 和迭代次数,你做到了吗?
  • 我认为只有 2 个功能应该只有 1 个最优,不是吗?还是我错了?
  • 根据数据的不同,可以有很多局部最优值。以函数 sin(x)*sin(y) 为例。
  • 首先将两个数据点拟合成一条直线可能会有所帮助,然后尝试更复杂的方法。

标签: python machine-learning linear-regression gradient-descent


【解决方案1】:

您正在对单个神经元使用线性回归,单个神经元只能学习一条直线,而与您提供的数据集无关,其中 W 充当斜率,您的网络已经为您的 X 学习了最佳 W,因此 WX 给出的错误最小.

输出的散点图(红点)显示了你的数据集值,你可以观察到,数据集不是线性的,所以即使你训练 1M 次,算法也永远不会收敛。但是学习到的函数肯定是最优的,因为它是一条误差最小的直线。

所以,我建议您使用具有非线性激活的多层,例如 ReLu 和 Sigmoid。在预测实数时在输出处使用线性激活。

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 2020-04-28
    • 1970-01-01
    • 2019-01-31
    • 2013-06-21
    • 2023-03-12
    • 1970-01-01
    • 2021-11-16
    • 2015-05-27
    相关资源
    最近更新 更多