# 张时赫--20221003646

# chapter1 定义

# chapter2 数学基础

# chapter3 线性回归

# 1. 回归问题的定义

  • 回归问题的目标是通过特征向量 预测连续的响应变量
  • 基本模型假设: 其中, 是随机误差项。
  • 参数方法与非参数方法:参数方法:对 的形式作具体假设,例如线性函数。非参数方法:不对 作任何形式假设,如KNN、决策树。

# 2. 线性回归的定义

  • 线性回归是通过线性函数描述因变量和自变量关系的回归分析方法:其中, 为截距, 为回归系数。

# 3. 普通最小二乘法(OLS)

  • 目标:最小化残差平方和(RSS)以估计回归系数:
  • 回归系数的估计β^=(X^TX)^{-1}X^Ty 其中, 是设计矩阵, 是响应变量向量。

# 4. 拟合优度

  • 用于评估模型的解释能力:决定系数( 越接近 1,模型越好。

# 5. 过拟合与泛化能力

  • 过拟合:模型对训练数据过度拟合,导致对新数据表现较差。
  • 缓解方法:增加正则化(如岭回归、LASSO)。使用交叉验证选择模型。

# 6. 偏差与方差权衡

  • 偏差-方差分解: 总误差= \text{偏差}^2 + \text{方差} + \text{不可约误差}
  • 高偏差:模型过于简单,无法捕获数据结构。
  • 高方差:模型过于复杂,对数据噪声敏感。

# 7. 再抽样方法

  • 交叉验证:将数据划分为训练集和测试集,循环评估模型性能。
  • 自助法:通过有放回的采样生成多个训练集,评估模型的稳定性。

# 线性回归建模

data(mtcars)
model <- lm(mpg ~ wt + hp, data = mtcars)
summary(model)

# 交叉验证

library(boot)
cv_model <- cv.glm(mtcars, model, K = 10)
cv_model$delta

# chapter4 逻辑回归

# 1. 逻辑回归的定义

  • 逻辑回归 是一种用于分类问题的统计方法。
  • 模型假设响应变量 是一个二分类变量(0 或 1),其条件概率为:其中, 是截距, 是回归系数。

# 2. 模型解释

  • 对数几率(Log-Odds)( 表示 的影响)
  • 模型输出 时预测 ,否则预测

# 3. 模型拟合

  • 目标函数:
    • 使用最大似然估计(MLE)拟合参数 β 或对应的对数似然函数: β
    • 通过梯度下降或牛顿法优化

# 4. 模型评估

  • 混淆矩阵:真阳性(TP)、真阴性(TN)、假阳性(FP)、假阴性(FN)。
  • 评估指标:
    • 准确率
    • 精确率
    • 召回率
    • F1-Score
    • ROC曲线和AUC值:衡量分类器的性能。

# 5. 逻辑回归的扩展

  • 多分类逻辑回归:通过 Softmax 函数扩展到多分类问题:

  • 正则化逻辑回归:加入 正则项防止过拟合

    β

    β

# 逻辑回归建模

data(iris)
iris_binary <- subset(iris, Species != "virginica")
iris_binary$Species <- ifelse(iris_binary$Species == "setosa", 1, 0)

logistic_model <- glm(Species ~ Sepal.Length + Sepal.Width, data = iris_binary, family = binomial)

summary(logistic_model)

# 模型评估

predicted_probs <- predict(logistic_model, type = "response")

library(pROC)
roc_curve <- roc(iris_binary$Species, predicted_probs)
auc(roc_curve)
plot(roc_curve)

# chapter5 决策

# chapter6 朴素贝叶斯/惩罚回归

# 1. 朴素贝叶斯

  • 核心假设:所有特征相互独立。

  • 主要公式

  • 条件独立假设

  • 优点:

    • 简单高效,计算量低。
    • 对小规模数据表现良好。
  • 缺点:

    • 假设特征独立,不适合特征之间高度相关的数据。
    • 对概率估计的准确性依赖较强。
  • 适用场景:文本分类(如垃圾邮件识别)、医疗诊断。


# 2. 岭回归

  • 公式θ

  • 优点:

    • 缓解多重共线性问题。
    • 特征权重收缩但不归零,适合特征较多的场景。
  • 缺点:不进行变量选择,所有特征都保留。

  • 适用场景:回归分析中,特征之间存在相关性的情况。


# 3. LASSO

  • 公式θ

  • 优点:

    • 自动进行变量选择,将部分权重收缩为0。
    • 模型更稀疏,解释性更强。
  • 缺点:在变量较多且相关性较高时,性能可能不如岭回归。

  • 适用场景:

    • 特征数量远大于样本数。
    • 希望降低模型复杂度的情况。

# 4. 弹性网

  • 公式θ

  • 优点:

    • 结合岭回归和LASSO的优势。
    • 对于多重共线性和高维数据表现更优。
  • 缺点:参数调节更复杂。

  • 适用场景:特征多且相关性强。


模型评估的标准

评估标准 公式 适用模型 优点 局限性
准确率 (Accuracy) 分类模型 直观易懂 不适合类别不平衡的数据
精确率 (Precision) 分类模型 适合关注正类结果准确度的场景 忽略了假负样本(FN)
召回率 (Recall) 分类模型 强调对正类样本的捕获能力 忽略了假正样本(FP)
F1 分数 (F1-Score) 分类模型 综合考虑精确率和召回率 对类别不平衡问题仍有局限
均方误差 (MSE) 回归模型 反映预测值与真实值之间的误差 对异常值敏感
决定系数 (R^2) 回归模型 衡量模型对数据的拟合程度 对数据分布依赖较强
交叉验证 (CV) 多试几次 分类和回归模型 能有效防止过拟合 计算量大,适合高性能场景

# 朴素贝叶斯

library(e1071)
nb_model <- naiveBayes(Species ~ ., data = iris)

# 岭回归

ridge_model <- glmnet(x, y, alpha = 0)

# LASSO

lasso_model <- glmnet(x, y, alpha = 1)

# 弹性网

elastic_net_model <- glmnet(x, y, alpha = 0.5)

# chapter07 KNN

# 1. K最近邻(KNN)算法

  • 定义:KNN是一种基于实例的非参数分类算法,利用“距离”度量进行分类或回归。
  • 核心思想:
    • 给定一个样本点,找到其在特征空间中距离最近的 个邻居。
    • 分类:根据邻居的多数类别决定样本点的类别。
    • 回归:根据邻居的平均值或加权平均值预测样本点的值。

# 2. KNN的原理

  • 距离度量
    • 常用的距离公式包括:
      • 欧氏距离:
      • 曼哈顿距离:
      • 闵可夫斯基距离:
  • 投票机制
    • 分类:采用多数投票机制。
    • 回归:计算邻居的平均值或加权平均值(权重与距离成反比)。
  • 影响因素
    • 的选取: 值过小可能导致过拟合,过大可能导致欠拟合。
    • 距离度量:选择合适的距离函数对分类结果影响较大。
    • 数据标准化:不同量纲的特征需要标准化(如归一化或Z-score标准化)。

# 3. 优点与缺点

  • 优点:
    • 简单直观,无需训练过程。
    • 对少量数据和类别分布较均匀时效果良好。
    • 可同时用于分类和回归问题。
  • 缺点:
    • 计算复杂度高,适合小数据集。
    • 对噪声和高维数据敏感。
    • 分类结果依赖于特征选择和距离度量方式。

# 4. KNN在案例中的应用

  • 分类问题
    • 例如:对手写数字进行分类(MNIST数据集)。
    • 流程:
      1. 计算测试样本与所有训练样本的距离。
      2. 选取距离最近的 个邻居。
      3. 根据邻居的类别进行投票,决定分类结果。
  • 回归问题
    • 例如:预测房价(基于邻居的房价计算均值)。
    • 流程:
      1. 计算目标样本与所有训练样本的距离。
      2. 找到最近的 个邻居。
      3. 计算这些邻居的平均值或加权平均值。
library(class)#分类
knn_model <- knn(train = iris[1:100, 1:4], test = iris[101:150, 1:4], cl = iris[1:100, 5], k = 3)
library(FNN)#回归
knn_reg <- knn.reg(train = train_data, test = test_data, y = train_labels, k = 5)

# chapter08 决策树

# 1. 决策树的定义

  • 决策树是一种树形结构的监督学习方法,可用于分类和回归任务。
  • 每个内部节点表示一个特征的测试,每个分支代表测试结果的输出,每个叶子节点表示一个类别或预测值。

# 2. 决策树的核心原理

  • 构建过程
    1. 选择最优特征作为分裂节点。
    2. 根据特征值将数据分成多个子集。
    3. 对每个子集递归重复上述过程,直到满足停止条件。
  • 分裂准则
    • 信息增益 其中, 表示集合 的熵。
    • 基尼指数特征 的分裂基尼指数为:
    • 均方误差(MSE)
  • 剪枝
    • 预剪枝:在树构建过程中限制树的深度或分裂样本数。
    • 后剪枝:构建完成后,通过评估验证集性能剪去多余的枝。

# 3. 决策树的优缺点

  • 优点:
    • 直观易懂,易于可视化。
    • 不需要特征归一化或标准化。
    • 可处理离散和连续数据。
  • 缺点:
    • 容易过拟合,泛化能力差。
    • 对小数据集敏感。
    • 分裂过程对数据噪声敏感。

# 4. 决策树在案例中的应用

  • 分类问题:预测决策,如客户是否会购买商品。
    • 步骤:
      1. 根据信息增益或基尼指数选择最优特征。
      2. 构建树并划分训练数据。
      3. 利用验证集进行剪枝优化。
  • 回归问题:预测房价
    • 步骤:
      1. 使用均方误差(MSE)选择分裂特征。
      2. 生成树结构并优化深度。

# 决策树分类

library(rpart)
# 构建决策树
model <- rpart(Species ~ ., data = iris, method = "class")
# 可视化决策树
plot(model)
text(model)

# 决策树回归

library(rpart)
# 构建回归树
model <- rpart(mpg ~ ., data = mtcars, method = "anova")
# 打印树
printcp(model)

# chapter09 随机森林

# 1. 随机森林的定义

  • 随机森林是一种基于集成学习的算法,通过构建多个决策树并结合其预测结果实现分类或回归任务。
  • 算法核心思想是利用 “随机采样”“特征随机性” 增强模型的泛化能力。

# 2. 随机森林的核心原理

  • 构建过程
    1. 样本随机性:从训练集中使用 有放回的随机采样 (即Bootstrap采样)生成多个子数据集。
    2. 特征随机性:在构建每棵树时,对每个分裂点随机选择部分特征而非全部特征。
    3. 每棵树单独训练,独立生成预测结果。
    4. 分类:通过多数投票确定最终类别。
    5. 回归:通过平均值或加权平均值作为最终预测值。
  • 重要参数
    • 树的数量(n_estimators):更多的树通常可以降低过拟合风险。
    • 随机特征数量(max_features):控制特征子集的大小。
    • 树的深度(max_depth):限制单棵树的复杂度。
  • 特征重要性评估
    • 基于分裂时的 信息增益基尼指数下降值 计算每个特征的重要性。
    • 特征的重要性可以用于特征选择。

# 3. 随机森林的优缺点

  • 优点:
    • 高精度,能处理非线性问题。
    • 抗过拟合能力强,尤其在高维数据和噪声较多的场景。
    • 自动计算特征的重要性。
  • 缺点:
    • 计算成本高,对内存需求大。
    • 预测时间较慢,不适合实时应用。
    • 不易解释,与单一决策树相比模型透明性较低。

# 4. 随机森林在案例中的应用

  • 分类问题
    • 步骤:
      1. 使用Bootstrap采样构建多个子数据集。
      2. 基于每个子数据集训练决策树。
      3. 根据多数投票得出最终分类结果。
  • 回归问题
    • 步骤:
      1. 构建多棵回归树。
      2. 使用树的平均值作为预测结果。

# 随机森林分类

library(randomForest)
rf_model <- randomForest(Species ~ ., data = iris, ntree = 100)
importance(rf_model)

# 随机森林回归

library(randomForest)
rf_model <- randomForest(mpg ~ ., data = mtcars, ntree = 100)
# 打印模型
print(rf_model)

# chapter11 PCA

# 1. 主成分分析(PCA)的定义

  • 主成分分析是一种降维技术,旨在通过线性变换将高维数据映射到低维空间,同时保留尽可能多的信息。
  • 目标是找到数据的主成分,这些主成分是数据中方差最大的方向。

# 2. PCA的核心原理

  • 主要步骤
    1. 数据标准化:将原始数据的每一维归一化到均值为0、方差为1。
    2. 计算协方差矩阵:通过协方差矩阵反映变量之间的线性相关性。
    3. 特征值分解:对协方差矩阵进行特征值分解,提取特征值和特征向量。
    4. 按特征值排序:选择前 个最大特征值对应的特征向量,形成主成分矩阵。
    5. 数据变换:通过主成分矩阵将原始数据投影到低维空间。
  • 主成分
    • 每个主成分是数据的一个线性组合,反映了数据在该方向上的方差信息。
    • 第一个主成分捕获最大方差,第二个主成分捕获剩余方差,且与第一个主成分正交。

# 3. 优缺点

  • 优点:
    • 降低数据维度,提高计算效率。
    • 去除变量间的多重共线性。
    • 可视化高维数据的低维表示。
  • 缺点:
    • 可能丢失部分信息,尤其是低方差特征的信息。
    • 主成分缺乏明确的物理意义,难以解释。

# 4. PCA的应用

  • 降维:将高维数据投影到低维空间,常用于图像处理和高维特征的数据预处理。
  • 噪声过滤:通过丢弃低特征值主成分,去除噪声影响。
  • 特征提取:选择重要的主成分作为输入特征。
  • 可视化:将高维数据映射到二维或三维空间,便于可视化分析。

# PCA降维

# 加载数据集
data(iris)
# 提取特征数据
X <- iris[, 1:4]
# 进行PCA分析
pca_result <- prcomp(X, center = TRUE, scale. = TRUE)
# 查看主成分
summary(pca_result)
# 绘制二维主成分图
biplot(pca_result)

# chapter11 聚类

# 1. 聚类分析的定义

  • 聚类分析是一种无监督学习方法,通过将数据划分为多个组(簇),使得组内数据的相似性最大化,组间数据的相似性最小化。
  • 常见用途:数据探索、降维、模式识别。

# 2. 聚类分析的核心原理

  • 常用聚类方法:
    1. 划分法:
      • K均值聚类(K-Means):
        • 将数据分为 个簇,最小化簇内平方误差: J=∑i=1k∑x∈Ci∥x−μi∥2J = \sum_{i=1}^k \sum_{x \in C_i} |x - \mu_i|^2 其中, 为第 个簇的中心。
        • 算法步骤:
          1. 初始化 个中心点。
          2. 计算每个数据点到中心点的距离,将其分配到最近的簇。
          3. 更新每个簇的中心点为簇内所有点的均值。
          4. 重复分配和更新,直到收敛。
      • 优点:简单高效,适合大规模数据。
      • 缺点:对初始中心点敏感,难以处理非球形分布的簇。
    2. 层次法:
      • 凝聚层次聚类:每个数据点初始化为单独的簇,逐步合并最近的簇。
      • 分裂层次聚类:从一个簇开始,逐步拆分为多个簇。
      • 距离度量方式:
        • 最小距离(单链法)
        • 最大距离(全链法)
        • 平均距离
      • 优点:不需要预先指定簇数。
      • 缺点:计算复杂度高。
    3. 密度法:
      • DBSCAN(Density-Based Spatial Clustering of Applications with Noise):
        • 基于密度的聚类方法,通过区域密度识别簇。
        • 优点:可识别任意形状的簇,对噪声鲁棒。
        • 缺点:需要指定参数(如 和最小点数),对参数较敏感。

# 3. 聚类评估指标

  • 内部指标

    (基于簇内和簇间数据的特性):

    1. 轮廓系数(Silhouette Coefficient) 其中, 是数据点到同簇内其他点的平均距离, 是数据点到最近的其他簇的平均距离。
    2. 簇内平方误差(Inertia): 计算所有点到其所属簇中心的距离平方和。
  • 外部指标(基于先验标签信息):

    1. Rand指数(Rand Index, RI):衡量聚类结果与真实分类之间的相似性。
    2. 互信息(Mutual Information, MI):度量聚类结果与真实标签之间的信息共享。

# 4. 聚类分析的应用

  • 客户分群:根据消费行为将客户划分为不同群体。
  • 图像分割:将图像划分为多个有意义的区域。
  • 基因数据分析:对基因表达模式进行聚类,揭示潜在生物学机制。

# K均值聚类

data(iris)
# 去除标签
X <- iris[, -5]
kmeans_result <- kmeans(X, centers = 3)
# 查看聚类结果
kmeans_result$cluster

# 层次聚类

# 计算距离矩阵
dist_matrix <- dist(X)
hclust_result <- hclust(dist_matrix, method = "ward.D2")
# 绘制
plot(hclust_result)

# DBSCAN

library(dbscan)
# 执行DBSCAN聚类
dbscan_result <- dbscan(X, eps = 0.5, minPts = 5)
# 查看聚类标签
dbscan_result$cluster

# chapter12 神经网络

# 1. 神经网络的发展历史

  • 第一阶段(1943-1969)
    • McCulloch 和 Pitts 提出第一个神经元数学模型(M-P模型),证明神经网络可计算任何算术与逻辑函数。
    • Hebb 提出生物神经元学习规则(Hebb学习规则)。
    • Rosenblatt 提出感知机模型,但 Minsky 和 Papert 指出其无法解决非线性问题。
  • 第二阶段(1982-1990)
    • Hopfield 提出递归网络模型(Hopfield网络)。
    • Rumelhart 等人提出反向传播算法(BP算法),推动多层神经网络的研究。
    • 神经网络因统计学习理论和支持向量机(SVM)的兴起再次低谷。
  • 第三阶段(2006-至今)
    • Hinton 提出深度信念网络(DBN),开启深度学习时代。
    • 随着云计算和大数据的崛起,深度学习在计算机视觉、自然语言处理等领域大获成功。

# 2. 神经网络的核心原理

  • M-P神经元模型
    • 输入信号通过带权连接传递。
    • 总输入值与阈值比较后,通过激活函数输出。
    • 常用激活函数:
      • Sigmoid函数:
      • ReLU函数:
  • 感知机与多层网络
    • 单层感知机:
      • 能解决线性可分问题,学习规则为调整权重以最小化误差。
    • 多层感知机(MLP):
      • 增加隐层,能解决非线性问题。
      • 使用误差逆传播算法(BP)训练网络。
  • 误差逆传播算法(BP)
    • 基于梯度下降策略,通过反向传播调整参数。
    • 更新公式:
    • 两种实现方式:
      • 标准BP:每次更新单个样本的权值。
      • 累计BP:基于整个训练集的累计误差更新权值。

# 3. 深度学习

  • 定义
    • 深度学习是具有多层神经元结构的神经网络,能够学习高层次特征表示。
  • 模型训练方法
    • 预训练+微调:通过逐层无监督预训练,再使用BP算法进行全局优化。
    • 权共享:在卷积神经网络(CNN)中,多个神经元共享相同的权值以减少参数数量。
  • 卷积神经网络(CNN)
    • 卷积层:通过卷积滤波器提取局部特征。
    • 采样层:对局部特征进行下采样,减少数据量。
    • 全连接层:将特征映射到输出目标。

# 4. 其他常见神经网络

  • RBF网络
    • 单隐层前馈网络,使用径向基函数作为激活函数。
    • 适合拟合连续函数。
  • ART网络
    • 竞争学习的无监督网络,能够动态调整神经元数量。
    • 解决了“可塑性-稳定性”问题。
  • SOM网络
    • 自组织映射网络,将高维数据映射到低维空间。
    • 保持高维数据的拓扑结构。
  • Boltzmann机
    • 基于能量函数的网络,通过最小化能量函数训练模型。
    • 常用的变种为受限Boltzmann机(RBM)。

# 神经网络建模

library(neuralnet)
nn <- neuralnet(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width,
                data = iris, hidden = c(5, 3), linear.output = FALSE)
# 绘制神经网络
plot(nn)

# 卷积神经网络(CNN)

library(keras)
model <- keras_model_sequential() %>%
  layer_conv_2d(filters = 32, kernel_size = c(3, 3), activation = 'relu', input_shape = c(28, 28, 1)) %>%
  layer_max_pooling_2d(pool_size = c(2, 2)) %>%
  layer_flatten() %>%
  layer_dense(units = 128, activation = 'relu') %>%
  layer_dense(units = 10, activation = 'softmax')