Contents

线性模型

概述

线性模型是一种基本的机器学习模型,用于建立输入特征与输出之间的线性关系。线性模型可以用来进行回归(预测连续值)和分类(预测离散标签)。 $$ y=w_1x_1+w_2x_2+\cdots+w_nx_n+b $$ 一般用向量形式写成: $$ y=w^T x+b $$

线性回归

一元线性回归

一元线性回归是线性回归的一种特例,用于建立一个输入特征与输出之间的线性关系,其中输入特征只有一个。它适用于预测连续的输出值,并且假设输入特征和输出之间存在着线性关系。 $$ y = wx + b $$

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 生成示例数据
np.random.seed(0)
X = np.random.rand(50, 1) * 10
y = 2 * X + 1 + np.random.randn(50, 1) * 2

# 创建线性回归模型
model = LinearRegression()

# 拟合模型
model.fit(X, y)

# 打印模型参数
print("斜率(权重 w):", model.coef_[0][0])
print("截距(偏置 b):", model.intercept_[0])

# 绘制数据和回归线
plt.scatter(X, y)
plt.plot(X, model.predict(X), color='red')
plt.xlabel('Input (X)')
plt.ylabel('Output (y)')
plt.title('Linear Regression')
plt.show()

多元线性回归

多元线性回归是一种统计模型,用于建立多个输入特征与输出之间的线性关系。它扩展了一元线性回归,适用于预测连续的输出值,并且假设输入特征和输出之间存在着线性关系。 $$ y = w_1 x_1 + w_2 x_2 + \ldots + w_n x_n + b $$

import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data  # 特征向量
y = boston.target  # 目标(房价)

# 创建线性回归模型
model = LinearRegression()

# 拟合模型
model.fit(X, y)

# 打印模型参数
print("权重(系数 w):", model.coef_)
print("偏置(截距 b):", model.intercept_)

对数线性回归

对数线性回归是线性回归的一种扩展,用于建立输入特征与输出之间的对数线性关系。在对数线性回归中,输入特征与输出之间的关系被建模为对数函数的线性关系。这种方法常用于处理数据中存在指数增长或衰减的情况,使得数据更加符合线性关系。 $$ \log(y) = w_1 x_1 + w_2 x_2 + \ldots + w_n x_n + b $$

import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import FunctionTransformer

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data  # 特征向量
y = boston.target  # 目标(房价)

# 创建对数线性回归模型
log_model = LinearRegression()

# 创建函数转换器,将目标 y 进行对数变换
log_transformer = FunctionTransformer(np.log1p, validate=True)
log_y = log_transformer.transform(y.reshape(-1, 1))

# 拟合模型
log_model.fit(X, log_y)

# 打印模型参数
print("截距项(w0):", log_model.intercept_)
print("权重(w1, w2, ..., wp):", log_model.coef_)

正则化

LASSO 回归

LASSO 回归 是一种线性回归的正则化技术,用于处理高维数据和特征选择。它在普通线性回归的基础上添加了一个 L1 正则化项,这个正则化项是权重向量中各个维度绝对值之和。LASSO 通过对权重进行惩罚,可以使得部分权重变成零,从而实现自动特征选择和模型稀疏化。

LASSO 回归的目标函数包括了一个损失函数项(通常是均方误差)和一个 L1 正则化项,可以表示为: $$ \text{LASSO loss} = \text{MSE} + \alpha \sum_{i=1}^{p} |w_i| $$

from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data  # 特征向量
y = boston.target  # 目标(房价)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 LASSO 模型
alpha = 0.01  # 正则化强度
lasso_model = Lasso(alpha=alpha)

# 拟合模型
lasso_model.fit(X_train, y_train)

# 预测
y_pred = lasso_model.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

# 打印模型权重
print("模型权重:", lasso_model.coef_)

岭回归(Ridge Regression)

岭回归是线性回归的一种正则化方法,用于处理多重共线性问题和模型过拟合。它在普通线性回归的基础上添加了一个 L2 正则化项,这个正则化项是权重向量各个维度的平方和。岭回归通过对权重进行惩罚,可以使得权重更加平滑,从而降低模型的复杂度,减少过拟合的风险。 $$ \text{Ridge loss} = \text{MSE} + \alpha \sum_{i=1}^{p} w_i^2 $$

from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data  # 特征向量
y = boston.target  # 目标(房价)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建岭回归模型
alpha = 1.0  # 正则化强度
ridge_model = Ridge(alpha=alpha)

# 拟合模型
ridge_model.fit(X_train, y_train)

# 预测
y_pred = ridge_model.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

# 打印模型权重
print("模型权重:", ridge_model.coef_)

弹性网络(Elastic Net)

弹性网络是线性回归的一种正则化方法,结合了 L1 和 L2 正则化,旨在克服 LASSO 和岭回归各自的限制。弹性网络通过在损失函数中同时引入 L1 和 L2 正则化项,可以同时实现特征选择和权重收缩,适用于高维数据和存在多重共线性的情况。 $$ \text{Elastic Net loss} = \text{MSE} + \alpha \left( \frac{1 - \rho}{2} \sum_{i=1}^{p} w_i^2 + \rho \sum_{i=1}^{p} |w_i| \right) $$

from sklearn.datasets import load_boston
from sklearn.linear_model import ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data  # 特征向量
y = boston.target  # 目标(房价)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建弹性网络模型
alpha = 0.01  # 正则化强度
rho = 0.5    # 混合参数
elastic_net_model = ElasticNet(alpha=alpha, l1_ratio=rho)

# 拟合模型
elastic_net_model.fit(X_train, y_train)

# 预测
y_pred = elastic_net_model.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)

# 打印模型权重
print("模型权重:", elastic_net_model.coef_)

线性分类

逻辑回归(对数几率回归)

逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法。

线性回归的方程如下: $$ y=w_1x_1+w_2x_2+\cdots+w_nx_n+b $$ 而回归要实现分类,需要将预测的连续型变量转变为离散型变量,可以通过引入联系函数,将线性回归方程$y$变换为$g(y)$,且$g(y)$的值分布在(0,1)之间。

对于逻辑回归而言,联系函数为 Sigmoid 函数: $$ g(y)=\frac{1}{1+e^{-y}} $$ 因而二分类的逻辑回归模型为: $$ y(x)=\frac{1}{1+e^{-wx}} $$

逻辑回归的本质是用线性回归去预测分类的形似对数几率 $$ \ln\frac{y(x)}{1-y(x)}=\ln\frac{\frac{1}{1+e^{-wx}}}{1-\frac{1}{1+e^{-wx}}}=wx $$

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征向量
y = iris.target  # 目标

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建逻辑回归模型
logistic_model = LogisticRegression()

# 拟合模型
logistic_model.fit(X_train, y_train)

# 预测
y_pred = logistic_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

多项逻辑回归

多项逻辑回归,也称为 softmax 回归或多类逻辑回归,是逻辑回归的扩展,用于处理多分类问题,其中输出类别有三个或更多个。多项逻辑回归使用 softmax 函数来将线性组合的输入特征映射到一个概率分布,然后根据最大概率来预测样本所属的类别。

多项逻辑回归使用 softmax 函数将输入特征的线性组合映射到一个概率分布。对于一个具有 K 个类别的多分类问题,softmax 函数的公式表示如下: $$ P(y = k \mid \mathbf{x}) = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}} $$

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征向量
y = iris.target  # 目标

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建多项逻辑回归模型
multi_logistic_model = LogisticRegression(multi_class='multinomial', solver='lbfgs')

# 拟合模型
multi_logistic_model.fit(X_train, y_train)

# 预测
y_pred = multi_logistic_model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

线性判别分析(LDA)

**线性判别分析(Linear Discriminant Analysis,LDA)**是一种用于分类和降维的统计方法,用于在多类别问题中找到最佳的投影方向,以便在新空间中实现类别的最大可分性。与主成分分析(PCA)不同,LDA是有监督的方法,它考虑了类别信息来优化投影方向。

  • LDA的目标是将不同类别的样本在新的低维空间中最大程度地分开,同时尽量将同一类别的样本投影到靠近一起的位置。

  • 它通过计算类间散布矩阵(类别之间的差异)和类内散布矩阵(类别内的差异)来选择最佳的投影方向。

  • 最终,LDA会选择投影方向,使得类间散布矩阵与类内散布矩阵的比值最大化。

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris

# 加载示例数据(鸢尾花数据集)
data = load_iris()
X = data.data  # 特征
y = data.target  # 目标类别

# 创建LDA对象,指定降维后的维度数量
num_components = 2
lda = LinearDiscriminantAnalysis(n_components=num_components)

# 执行线性判别分析
X_lda = lda.fit_transform(X, y)

# 输出降维后的数据
print("Original Data Shape:", X.shape)
print("LDA Transformed Data Shape:", X_lda.shape)