我正在尝试使用随机梯度下降作为求解器在Python中实现Ridge回归的解决方案。我的SGD代码如下:
def fit(self, X, Y):
# Convert to data frame in case X is numpy matrix
X = pd.DataFrame(X)
# Define a function to calculate the error given a weight vector beta and a training example xi, yi
# Prepend a column of 1s to the data for the intercept
X.insert(0, 'intercept', np.array([1.0]*X.shape[0]))
# Find dimensions of train
m, d = X.shape
# Initialize weights to random
beta = self.initializeRandomWeights(d)
beta_prev = None
epochs = 0
prev_error = None
while (beta_prev is None or epochs < self.nb_epochs):
print("## Epoch: " + str(epochs))
indices = range(0, m)
shuffle(indices)
for i in indices: # Pick a training example from a randomly shuffled set
beta_prev = beta
xi = X.iloc[i]
errori = sum(beta*xi) - Y[i] # Error[i] = sum(beta*x) - y = error of ith training example
gradient_vector = xi*errori + self.l*beta_prev
beta = beta_prev - self.alpha*gradient_vector
epochs += 1
我正在测试的数据没有标准化,我的实现总是以所有权重为无穷大结束,即使我将权重向量初始化为低值。只有当我将学习率alpha设置为非常小的值~1e-8时,算法才会得到权重向量的有效值。
我的理解是,规范化/缩放输入功能仅有助于缩短收敛时间。但是如果特征没有标准化,算法不应该整体收敛。我的理解是否正确?
答案 0 :(得分:1)
您可以从scikit-learn's Stochastic Gradient Descent文档中查看该算法的一个缺点是它对特征缩放敏感。通常,基于梯度的优化算法在标准化数据上收敛得更快。
此外,归一化对于回归方法是有利的。
每个步骤中系数的更新将取决于每个特征的范围。此外,正则化项将受到大特征值的严重影响。
SGD 可能在没有数据规范化的情况下收敛,但这对于手头的数据是主观的。因此,您的假设是不正确的。
答案 1 :(得分:0)
你的假设不正确。
很难回答这个问题,因为有很多不同的方法/环境,但我会尝试提一些观点。