标签:大小 避免 度量 ext res http inline tps 方法
class MyLinearRegression():
def __init__(self, n_iterations=10000, learning_rate=0.0001, regularization=None, gradient=True):
‘‘‘初始化。是否正则化及L1L2的选择;选用梯度下降法还是正规方程法。梯度下降学习率以及迭代次数‘‘‘
self.n_iterations = n_iterations
self.learning_rate = learning_rate
self.gradient = gradient
if regularization == None:
self.regularization = lambda x: 0
self.regularization.grad = lambda x: 0
else:
self.regularization = regularization
def initialize_weights(self, n_features):
‘‘‘初始化权重.初始化模型参数,加入w0‘‘‘
limit = np.sqrt(1 / n_features)
w = np.random.uniform(-limit, limit, (n_features, 1)) #二维数组,n行一列。
b = 0
self.w = np.insert(w, 0, b, axis=0)
def fit(self,X,y,):
‘‘‘进行拟合‘‘‘
m_samples, n_features = X.shape # !!!
self.initialize_weights(n_features)
X = np.insert(X, 0, 1, axis=1) #二维数组,每行前面加上元素1
y = np.reshape(y, (m_samples, 1)) #二维数组,m 行一列
self.training_errors = []
if self.gradient == True: #批量梯度下降
for i in range(self.n_iterations):
y_pred = X.dot(self.w)
loss = np.mean(0.5 * (y_pred - y) ** 2)/m_samples + self.regularization(self.w) # 矩阵运算
‘‘‘mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
axis 不设置值,对 m*n 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
np.mean(X,axis=0或者1,keepdims=True)
‘‘‘
self.training_errors.append(loss)
w_grad = X.T.dot(y_pred - y) + self.regularization.grad(self.w) # (y_pred - y).T.dot(X),计算梯度
self.w = self.w - self.learning_rate * w_grad # 更新权值w
else:
# 正规方程
X = np.matrix(X)
y = np.matrix(y)
X_T_X = X.T.dot(X)
X_T_X_I_X_T = X_T_X.I.dot(X.T)
X_T_X_I_X_T_X_T_y = X_T_X_I_X_T.dot(y)
self.w = X_T_X_I_X_T_X_T_y
def predict(self, X):
X = np.insert(X, 0, 1, axis=1)
y_pred = X.dot(self.w)
return y_pred
‘‘‘以二元为例,进行拟合‘‘‘
lr = MyLinearRegression()
X = np.array([[1,2],[2,4],[50,3],[23,59],[10,45],[10,61]])
y = np.array([3,6,53,82,55,71])
lr.fit(X,y)
y_test = lr.predict(np.array([[1,40],[2,6]]))
print(y_test)
L1正则化下的损失函数\[\mathbf{\mathit{J}}(\mathbf{w})=\frac{1}{2m}\sum_{i=1}^{m}(f(\mathbf{x}_i)-y_i)^2+\lambda \left \| \mathbf{w} \right \|_{1}\]其中\(\left \| \mathbf{w} \right \|_{1}=\sum w_j\)
L2正则化下的损失函数\[\mathbf{\mathit{J}}(\mathbf{w})=\frac{1}{2m}\sum_{i=1}^{m}(f(\mathbf{x}_i)-y_i)^2+\lambda \left \| \mathbf{w} \right \|_{2}^2\]其中\(\left \| W \right \|_{2}=\sqrt{\sum w_j^2}\)
加入L1正则化后称为Lasso回归,加入L2正则化称为Ridge回归,其中 \(\lambda\)为模型的超参数。
L1 regularizer : 它的优良性质是能产生稀疏性,导致 W 中许多项变成零。 稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。
L2 regularizer :使得模型的解偏向于 norm 较小的 W,通过限制 W 的 norm 的大小实现了对模型空间的限制,从而在一定程度上避免了 overfitting 。不过 ridge regression 并不具有产生稀疏解的能力,得到的系数 仍然需要数据中的所有特征才能计算预测结果,从计算
量上来说并没有得到改观。
关于正则化参考[https://www.jianshu.com/p/a47c46153326]
机器学习:线性回归——理论与代码实现(基于正规方程与梯度下降)
标签:大小 避免 度量 ext res http inline tps 方法
原文地址:https://www.cnblogs.com/lyxML/p/9531293.html