#1.单元线性回归梯度下降法
import numpy as np
# 生成一些示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)#生成一个大小为(100,1)的随机数数组,随机数在[0,2)范围之内
y = 4 + 3 * X + np.random.randn(100, 1)
'''#其中的np.random.randn(100,1)这一部分是生成一个大小为 (100, 1) 的随机数数组,
#其中的随机数是从标准正态分布中抽取的。这个部分添加了随机噪声到模型中,以模拟现实世界数据的不确定性和随机性。
'''
# 添加偏置项(intercept)
X_b = np.c_[np.ones((100, 1)), X]
'''np.c_这是NumPy中的一种特殊语法,用于连接两个数组。在这里,np.c_[] 用于将两个数组按列连接在一起,
其中第一个数组是全为1的数组,第二个数组是原始特征矩阵 X。这将创建一个新的特征矩阵 X_b,其中第一列是全为1的列(截距项),第二列是原始特征矩阵 X。
这行代码的目的是将原始特征矩阵 X 扩展为一个新的特征矩阵 X_b,该矩阵包含了截距项和原始特征,通常用于线性回归模型中,以便进行线性回归分析。
在线性回归中,截距项和原始特征的系数将用于拟合一个线性模型来预测目标变量。
'''
# 定义初始参数和学习率
theta = np.random.randn(2, 1)#初始化参数,theta=intercept,slope
learning_rate = 0.01
n_iterations = 1000#迭代次数
# 梯度下降训练模型
for iteration in range(n_iterations):
#gradients = -2/100 * X_b.T.dot(y - X_b.dot(theta))
gradients=1/100*X_b.T.dot(X_b.dot(theta)-y)
'''
1.X_b.dot(theta)计算预测值
2.y-X_b.dot(theta)计算模型的预测误差
3.X_b.T.dot(y - X_b.dot(theta))求导后的梯度向量,包含每个参数的偏导数
'''
theta = theta - learning_rate * gradients
# 训练后的参数
intercept, slope = theta
print("训练后的截距(intercept):", intercept)
print("训练后的斜率(slope):", slope)
#2.多元线性回归梯度下降法
import numpy as np
# 生成一些示例数据
np.random.seed(0)
m = 100 # 样本数量
n = 3 # 特征数量
# 生成随机特征和目标变量
X = 2 * np.random.rand(m, n)#X是(100,3)的矩阵
y = 4 + 3 * X[:, 0] + 2 * X[:, 1] + 5*X[:,2]+np.random.randn(m)
#y = 4 + np.dot(X, np.array([3, 5, 2,1])) + np.random.randn(m)
# 添加偏置项(intercept)
X_b = np.c_[np.ones((m, 1)), X]#X_b是(100,4)的矩阵
# 定义初始参数和学习率
theta = np.random.randn(n + 1)
learning_rate = 0.01
n_iterations = 20000
# 梯度下降训练模型
for iteration in range(n_iterations):
#gradients = -2/m * X_b.T.dot(y - X_b.dot(theta))
gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
theta = theta - learning_rate * gradients
# 训练后的参数
intercept=theta[0]
coefficients = theta[1], theta[2],theta[3]
print("训练后的截距(intercept):", intercept)
print("训练后的系数(coefficients):", coefficients)