BP算法实现y=2x线性回归梯度下降拟合

版权申诉
0 下载量 109 浏览量 更新于2024-10-21 收藏 148KB ZIP 举报
资源摘要信息:"该文档主要介绍了一种通过反向传播(Back Propagation,简称BP)算法实现的线性回归模型,并详细阐述了如何使用梯度下降算法来拟合一条具有特定斜率的直线,即y=2x。" 知识点详细说明: 1. 线性回归(Linear Regression): 线性回归是统计学中用来预测数值型变量之间关系的一种方法。它的基本思想是找到一条直线,使得这条直线能够尽可能地接近所有数据点,即最小化预测值与实际值之间的误差。线性回归模型可以表示为y = ax + b的形式,其中y是预测值,x是自变量,a是斜率,b是截距。 2. 线性回归拟合(Linear Regression Fitting): 线性回归拟合指的是如何找到最佳的参数(即直线的斜率和截距),使得这一直线可以最好地描述数据点的分布。常用的拟合方法包括最小二乘法,它通过最小化误差的平方和来求解回归模型的参数。 3. BP算法(Back Propagation Algorithm): BP算法是一种在神经网络中广泛使用的反向传播算法,主要用于训练多层前馈神经网络。通过BP算法,可以有效地计算神经网络中各层权重和偏置的梯度,进而通过梯度下降算法更新权重,以实现网络训练的目的。尽管BP算法通常用于非线性模型,但在本例中,它被应用于线性回归模型中,可能是指在神经网络结构中实现线性回归。 4. 梯度下降(Gradient Descent): 梯度下降是一种用来寻找函数最小值的优化算法。在机器学习中,它通常被用来最小化损失函数。基本思想是沿着函数的梯度(即函数值下降最快的方向)迭代寻找最小值。对于线性回归模型,损失函数可以定义为误差平方和,梯度下降算法通过迭代更新模型参数,逐步逼近损失函数的最小值。 5. 实现细节: 要使用梯度下降算法拟合直线y=2x,首先需要定义一个损失函数。由于是线性回归模型,损失函数通常取为误差的平方和,即L(θ) = Σ(y_i - (2x_i))^2,其中θ代表模型参数。在每次迭代中,更新斜率a和截距b的方式如下: a = a - α * (Σ2(y_i - (ax_i + b)) * x_i) b = b - α * Σ(y_i - (ax_i + b)) 其中,α是学习率,是一个预先设定的常数,控制着参数更新的步伐大小。更新规则是根据损失函数对参数a和b的梯度计算得出的。 6. 应用场景: 线性回归是一种简单且强大的预测模型,它可以应用于各种数据挖掘和统计分析领域。例如,在经济学中预测消费和收入之间的关系,在生物学中研究生物体的重量和年龄之间的关联,在市场分析中评估广告投入和销售量之间的关系等。通过梯度下降拟合y=2x,可以训练出能够根据输入x预测输出y的模型,并在实际应用中进行预测。 总结: 本文件所描述的通过BP算法实现的线性回归模型,以及使用梯度下降算法来拟合直线y=2x的方法,是一种基础且重要的机器学习技术。掌握这些概念对于理解和应用更高级的机器学习算法有着重要的作用。在实际应用中,线性回归拟合是进行预测和决策的重要工具,尤其是在需要建立简单、透明的模型时。梯度下降算法作为优化技术的核心部分,其理解和应用是机器学习领域不可或缺的知识点。

import numpy as np from sklearn import datasets from sklearn.linear_model import LinearRegression np.random.seed(10) class Newton(object): def init(self,epochs=50): self.W = None self.epochs = epochs def get_loss(self, X, y, W,b): """ 计算损失 0.5sum(y_pred-y)^2 input: X(2 dim np.array):特征 y(1 dim np.array):标签 W(2 dim np.array):线性回归模型权重矩阵 output:损失函数值 """ #print(np.dot(X,W)) loss = 0.5np.sum((y - np.dot(X,W)-b)2) return loss def first_derivative(self,X,y): """ 计算一阶导数g = (y_pred - y)*x input: X(2 dim np.array):特征 y(1 dim np.array):标签 W(2 dim np.array):线性回归模型权重矩阵 output:损失函数值 """ y_pred = np.dot(X,self.W) + self.b g = np.dot(X.T, np.array(y_pred - y)) g_b = np.mean(y_pred-y) return g,g_b def second_derivative(self,X,y): """ 计算二阶导数 Hij = sum(X.T[i]X.T[j]) input: X(2 dim np.array):特征 y(1 dim np.array):标签 output:损失函数值 """ H = np.zeros(shape=(X.shape[1],X.shape[1])) H = np.dot(X.T, X) H_b = 1 return H, H_b def fit(self, X, y): """ 线性回归 y = WX + b拟合,牛顿法求解 input: X(2 dim np.array):特征 y(1 dim np.array):标签 output:拟合的线性回归 """ self.W = np.random.normal(size=(X.shape[1])) self.b = 0 for epoch in range(self.epochs): g,g_b = self.first_derivative(X,y) # 一阶导数 H,H_b = self.second_derivative(X,y) # 二阶导数 self.W = self.W - np.dot(np.linalg.pinv(H),g) self.b = self.b - 1/H_bg_b print("itration:{} ".format(epoch), "loss:{:.4f}".format( self.get_loss(X, y , self.W,self.b))) def predict(): """ 需要自己实现的代码 """ pass def normalize(x): return (x - np.min(x))/(np.max(x) - np.min(x)) if name == "main": np.random.seed(2) X = np.random.rand(100,5) y = np.sum(X3 + X**2,axis=1) print(X.shape, y.shape) # 归一化 X_norm = normalize(X) X_train = X_norm[:int(len(X_norm)*0.8)] X_test = X_norm[int(len(X_norm)*0.8):] y_train = y[:int(len(X_norm)0.8)] y_test = y[int(len(X_norm)0.8):] # 牛顿法求解回归问题 newton=Newton() newton.fit(X_train, y_train) y_pred = newton.predict(X_test,y_test) print(0.5np.sum((y_test - y_pred)**2)) reg = LinearRegression().fit(X_train, y_train) y_pred = reg.predict(X_test) print(0.5np.sum((y_test - y_pred)**2)) ——修改代码中的问题,并补全缺失的代码,实现牛顿最优化算法

2023-06-13 上传