1、线性回归
线性回归是一种常用的机器学习算法,用于预测一个连续变量的值。其目标是找到一条直线,使预测值与真实值之间的差距最小。
参考文档:Python 机器学习 线性回归算法
2、损失函数
线性回归模型的性能通常通过损失函数(或成本函数)来衡量,它计算了模型预测值与实际目标值之间的差异。对于线性回归,最常用的损失函数是均方误差(Mean Squared Error, MSE)损失。公式如下,
import numpy as np
# 假设 X 是输入特征矩阵,y 是目标值向量
X = np.array([[1, 2], [1, 3], [1, 4], [1, 5]]) # 添加了一列1作为x0,以便处理截距项
y = np.array([5, 7, 9, 11])
# 初始化模型参数,theta0为截距,theta1, theta2为斜率
theta = np.array([0.1, 0.2])
# 线性回归模型的预测函数
def predict(X, theta):
return X.dot(theta)
# 计算损失函数(MSE)
def compute_loss(X, y, theta):
m = len(y)
y_pred = predict(X, theta)
loss = (1 / (2 * m)) * np.sum(np.square(y_pred - y))
return loss
# 计算损失值
loss = compute_loss(X, y, theta)
print(f"Loss: {loss}")
参考文档:Python 机器学习 线性回归算法
3、正规方程(Normal Equation)
为了找到最小化损失的模型参数,可以使用多种优化技术,其中一种是正规方程(Normal Equation)。正规方程是一种解析方法,直接计算出最优的模型参数(即权重),而不需要迭代优化过程(如梯度下降)。特别适用于特征数量不是特别大的情况,因为计算矩阵的逆可能在特征数量非常大时变得计算上不可行。对于特征数非常多的情况,使用梯度下降或其他优化算法可能更合适。公式如下,
import numpy as np
# 假设X是特征矩阵,y是目标变量向量
# 为X添加一列1,用于计算偏置项(截距)
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.array([6, 8, 9, 11])
X_b = np.c_[np.ones((4, 1)), X] # 添加一列1
# 使用正规方程计算最佳参数
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("最佳参数 (截距和斜率):", theta_best)
使用示例:
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 生成一个回归数据集
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
# 添加截距项
X_b = np.c_[np.ones((100, 1)), X] # 添加x0 = 1到每个实例
# 使用正规方程计算最佳参数
beta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# 显示计算出的参数(截距和系数)
print("计算出的参数:", beta_best)
# 预测
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # 同样添加x0 = 1
y_predict = X_new_b.dot(beta_best)
print("预测值:", y_predict)
# 使用训练集和测试集来评估模型性能
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train_b = np.c_[np.ones((X_train.shape[0], 1)), X_train]
X_test_b = np.c_[np.ones((X_test.shape[0], 1)), X_test]
beta_best_train = np.linalg.inv(X_train_b.T.dot(X_train_b)).dot(X_train_b.T).dot(y_train)
y_test_predict = X_test_b.dot(beta_best_train)
mse = mean_squared_error(y_test, y_test_predict)
print("测试集上的MSE:", mse)