【发布时间】: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()
【问题讨论】:
-
有什么问题?无法保证 GD 会收敛到全局最优值。
-
达到全局最优需要你调整两个超参数:学习率 (alpha) 和迭代次数,你做到了吗?
-
我认为只有 2 个功能应该只有 1 个最优,不是吗?还是我错了?
-
根据数据的不同,可以有很多局部最优值。以函数 sin(x)*sin(y) 为例。
-
首先将两个数据点拟合成一条直线可能会有所帮助,然后尝试更复杂的方法。
标签: python machine-learning linear-regression gradient-descent