在这里插入图片描述

💥 项目专栏:sklearn实现经典机器学习算法(附代码+原理介绍)


前言

🌟 哈喽,亲爱的小伙伴们,你们知道吗?最近我们的粉丝群里有好多小可爱私信问我一些关于决策树、逻辑回归等机器学习的超级有趣的问题呢!🌈 为了让大家更轻松地理解,我决定开一个超可爱的专栏,叫做 用sklearn玩转机器学习,特别适合机器学习的小新手哦!

🍬 在这个专栏里,我们会用sklearn这个超级强大的魔法工具来实现各种闪闪发光的机器学习算法!不用担心难度哦,我会用最简单、最可爱的方式,带领大家一起探索算法的神秘世界!✨

🎈 适合哪些小伙伴加入呢?当然是对机器学习感兴趣的小新手们,还有那些刚开始接触sklearn的可爱宝宝们!我们会一起学习如何用sklearn轻松实现那些看起来好厉害的机器学习算法,让新手小白也能快快乐乐地理解它们哦!

🌸 在这个专栏里,大家可以看到用sklearn实现的机器学习算法,我们不仅仅是理论学习哦,每一篇文章都会附带 完整的代码+超级可爱的原理讲解,让大家在轻松愉快的氛围中一起学习成长呢!🌼 快来加入我们的学习大冒险吧!


在这里插入图片描述

🚨 我的项目环境:

  • 平台:Windows11
  • 语言环境:Python 3.10
  • 编译器:Jupyter Lab、PyCharm
  • scikit-learn:1.2.1
  • Pandas:1.3.5
  • Numpy:1.19.3
  • Scipy:1.7.3
  • Matplotlib:3.1.3

💥 项目专栏:sklearn实现经典机器学习算法(附代码+原理介绍)


一、LDA算法背景

LDA算法概述

LDA(Linear Discriminant Analysis,线性判别分析)是一种用于分类和降维的统计方法,尤其适用于多分类问题。LDA的核心目标是找到一个投影,使得不同类别的数据在这个新的空间中尽可能地分开。

LDA的特点

  1. 监督学习:LDA是一种监督学习算法,它使用数据的类别标签来指导学习过程。

  2. 类别间分离:LDA旨在最大化不同类别间的距离,同时最小化同一类别内的差异。

  3. 数据降维:LDA可以用作降维技术,将特征空间中的数据投影到较低维度的空间,以便于可视化或进一步分析。

  4. 应用广泛:LDA广泛应用于模式识别、机器学习、生物信息学等领域。

LDA的使用场景

  • 分类任务:LDA常用于分类任务,尤其是当特征间存在线性关系时。
  • 特征提取:在训练分类模型之前,LDA可以用来提取有助于区分不同类别的特征。
  • 数据可视化:通过将数据投影到较低维度,LDA可以帮助可视化数据的结构,尤其是在多类数据集中。

LDA的优势与局限

优势

  • 简单高效:LDA具有较强的数学理论支撑,而且计算效率高。
  • 良好的分类性能:在多数情况下,尤其是当数据集满足LDA的基本假设时,LDA可以提供良好的分类性能。

局限

  • 线性假设:LDA假设数据是线性可分的,这在实际复杂数据集中可能不成立。
  • 正态分布假设:LDA假设每个类别的数据都近似符合正态分布。
  • 相同协方差假设:LDA还假设不同类别具有相同的协方差矩阵。

总结来说,LDA是一种强大的工具,适用于需要考虑数据类别标签的情景。它在许多领域都有广泛的应用,尤其是在需要区分不同类别的任务中。然而,LDA的有效性取决于数据集是否满足其基本假设。

二、算法原理

线性判别分析(LDA)的算法原理基于找到一个线性组合的特征,这种特征能够最好地区分两个或多个类别。这里是LDA的核心思想和数学原理的概述:

核心思想

LDA的主要目标是寻找一个投影方向,使得在这个方向上,不同类别的数据点最大程度上分离。为了达到这个目标,LDA尝试:

  1. 最大化类间差异:不同类别的数据点在新的特征空间上应该尽可能分散。
  2. 最小化类内差异:同一类别的数据点在新的特征空间上应该尽可能聚集。

数学原理

1. 计算类内和类间散布矩阵
  • 类内散布矩阵(Within-class scatter matrix):这个矩阵表示每个类内的数据点与其各自类别平均值之间的分散程度。

  • 类间散布矩阵(Between-class scatter matrix):这个矩阵表示各个类别的平均值与总体平均值之间的分散程度。

2. 寻找最优投影方向
  • LDA寻找一个线性投影,使得类间散布矩阵与类内散布矩阵之比最大。这通常涉及到求解一个广义特征值问题。
3. 选择特征
  • 从求得的特征值中选择最大的几个,并将它们对应的特征向量作为最佳的投影方向。
4. 数据投影
  • 最后,数据被投影到选定的特征向量上,从而实现降维。

LDA的假设

LDA的有效性依赖于一些关键假设:

  • 数据在每个类别中大致呈正态分布。
  • 不同类别的数据具有相同的协方差矩阵。
  • 特征是统计上相互独立的。

当这些假设不被严格满足时,LDA的性能可能会受到影响。

总结

LDA的核心在于通过线性变换将数据投影到新的空间,以实现类别之间的最大可分性。它是一种在特征提取和降维中非常有效的技术,尤其是在分类任务中。然而,它的性能依赖于数据集是否满足其基本假设。

三、LDA算法实现

3.1 导包

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

3.2 加载数据集

这段代码是在加载和准备鸢尾花(Iris)数据集,以便于后续的数据分析或机器学习应用。代码执行的具体步骤如下:

  1. 加载Iris数据集:使用datasets.load_iris()方法从sklearn(一个广泛使用的Python机器学习库)加载Iris数据集。这个数据集包含了三种鸢尾花(Setosa、Versicolour、Virginica)的样本。

  2. 提取特征和标签

    • X = iris.data:这行代码提取了数据集中的特征,即每个鸢尾花样本的测量数据,如萼片长度、萼片宽度、花瓣长度和花瓣宽度。
    • y = iris.target:提取了每个样本的类别标签。在Iris数据集中,标签分别对应三种鸢尾花。
  3. 获取目标类别名称target_names = iris.target_names 获取了数据集中目标类别的名称,即鸢尾花的三个种类名称。

# 加载Iris数据集
iris = datasets.load_iris()
X = iris.data  # Iris数据集的特征
y = iris.target  # 对应的标签
target_names = iris.target_names  # 目标类别的名称

3.3 PCA降维处理

主成分分析(PCA,Principal Component Analysis)是一种统计方法,用于通过线性变换将数据转换到新的坐标系,从而降低数据的维度。在这个新的坐标系中,第一个坐标轴选择的是能够最大化数据方差的方向,每个随后的坐标轴都是在与之前坐标轴正交的条件下能最大化方差的方向。这种方法使得转换后的第一个主成分保留了原始数据中最多的变异性,第二个主成分保留了次多的变异性,依此类推。PCA广泛应用于探索性数据分析和预处理数据,尤其是在需要降维或者去除数据中相关性的情况下,如在视觉图像分析、信号处理、生物信息学等领域。通过减少数据集中的特征数量,PCA有助于简化模型并减少计算资源需求,同时可能提升算法性能。

# PCA降维处理
pca = PCA(n_components=2)  # 初始化PCA,设置降维后的主成分数目为2
X_r = pca.fit_transform(X)  # 对特征进行降维处理

# 打印PCA的方差解释比,显示每个主成分的重要性
print("PCA解释的方差比例:", pca.explained_variance_ratio_)

这段代码是使用主成分分析(PCA)对数据进行降维处理的过程,具体步骤如下:

  1. 初始化PCApca = PCA(n_components=2) 这行代码创建了一个PCA对象,n_components=2 指定了降维后保留的主成分数目为2。这意味着原始数据集将被降维到两个维度。

  2. 数据降维X_r = pca.fit_transform(X) 这行代码对数据集X(原始特征)应用了PCA降维。方法fit_transform()首先拟合数据,计算出数据的主成分,然后将原始数据转换(或投影)到这些主成分定义的新空间中。结果X_r是降维后的数据。

  3. 打印方差解释比print("PCA解释的方差比例:", pca.explained_variance_ratio_) 这行代码输出了每个主成分解释的方差比例。方差解释比表示每个主成分在原始数据集方差中所占的比例。这提供了关于降维过程中各个主成分重要性的信息,即每个主成分保留了原始数据多少信息。

主成分分析(PCA,Principal Component Analysis)是一种流行的数据降维技术,在sklearn库中以PCA类的形式实现。以下是PCA类的一些常用参数,包括参数名称、描述以及可选的值或类型:

参数 描述 可选的值/类型
n_components 降维后的维数。可以指定为整数,表示保留的主成分个数;也可以是0到1之间的浮点数,表示保留的方差比例。 整数、0到1之间的浮点数或mle
copy 是否在运行算法前复制数据。如果设置为False,则原始数据可能被覆盖。 布尔值
whiten 是否白化数据,即对每个特征进行归一化,使之具有单位方差。 布尔值
svd_solver 用于计算PCA的奇异值分解(SVD)的方法。 'auto', 'full', 'arpack', 'randomized'
tol 仅当svd_solverarpack时有效,是奇异值分解的公差。 非负浮点数
iterated_power 用于计算SVD的迭代次数,仅当svd_solverrandomized时有效。 正整数或'auto'
random_state 随机数生成器的种子,对于svd_solverarpackrandomized时影响结果。 整数或None

这些参数使得PCA类在处理不同的数据集时具有很大的灵活性和调整能力。根据具体的数据特性和降维需求,可以选择适当的参数来优化PCA的效果。理解并合理使用这些参数对于提取重要特征、数据降维以及后续的数据分析和机器学习应用都至关重要。

3.4 LDA降维处理

这段代码展示了如何使用线性判别分析(LDA)进行数据的降维处理。具体步骤解释如下:

  1. 初始化LDA

    • lda = LinearDiscriminantAnalysis(n_components=2):这行代码创建了一个LDA对象。n_components=2指定了在降维过程中要保留的成分(或特征)数目为2。在LDA中,这通常意味着保留的是能够最大化类别间差异的线性组合。
  2. 数据降维

    • X_r2 = lda.fit_transform(X, y):这行代码对原始特征数据集X应用LDA,同时利用了标签信息y。LDA作为一种监督学习算法,使用标签信息来找到最佳的线性组合,以区分不同的类别。
    • fit_transform()方法首先训练(fit)模型,找到最佳的线性组合,然后将数据转换(transform)到这个新的空间,即执行降维。
# LDA降维处理
lda = LinearDiscriminantAnalysis(n_components=2)  # 初始化LDA,设置降维后的成分数目为2
X_r2 = lda.fit_transform(X, y)  # 对特征进行降维处理,并使用标签信息

线性判别分析(LDA,Linear Discriminant Analysis)在sklearn库中通过LinearDiscriminantAnalysis类实现,提供了多种参数以调整模型的行为。以下是LinearDiscriminantAnalysis类的一些常用参数,包括参数名称、描述以及可选的值或类型:

参数 描述 可选的值/类型
solver 用于计算LDA的算法。 ‘svd’, ‘lsqr’, ‘eigen’
shrinkage 用于’lsqr’和’eigen’求解器的收缩参数。可用于提高分类准确率,特别是在小样本情况下。 ‘auto’, 范围在0到1之间的浮点数 或 None
priors 类别的先验概率。如果指定,则求解器将使用这些先验概率而不是从数据中估算。 类别数量相等的浮点数数组 或 None
n_components 用于降维的成分数。降维后保留的最大类别数减一。 正整数 或 None
store_covariance 是否计算并存储协方差矩阵或精确的类内散布矩阵。 布尔值
tol 用于’lsqr’和’eigen’求解器的奇异值分解公差。 正浮点数

这些参数允许用户根据具体数据集和性能需求,灵活地调整LDA模型的行为。例如,通过选择合适的solver和调整shrinkage,可以在不同的数据集上实现更优的分类性能。正确理解和使用这些参数对于优化LDA模型的表现和提高分类准确率至关重要。

3.5 可视化

如下图是使用PCA对原始数据进行降维的后果:

在这里插入图片描述

如下图是使用LDA对原始数据进行降维的后果:

在这里插入图片描述

# 绘制PCA结果的散点图
plt.figure(figsize=(10, 5))
colors = ['navy', 'turquoise', 'darkorange']
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=0.8, lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA对鸢尾花数据集的降维')

# 绘制LDA结果的散点图
plt.figure(figsize=(10, 5))
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=0.8, color=color, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA对鸢尾花数据集的降维')

plt.show()

这段代码的作用是使用matplotlib库来绘制PCA(主成分分析)和LDA(线性判别分析)结果的散点图,以可视化方式展示这两种降维技术在鸢尾花(Iris)数据集上的效果。对于每种方法,代码创建了一个10x5英寸大小的图形,并为鸢尾花数据集的三个类别(Setosa、Versicolour、Virginica)分别用不同的颜色(‘navy’、‘turquoise’、‘darkorange’)绘制散点图。每个散点图中的点代表数据集中的一个样本,其位置根据PCA或LDA降维后的两个主要成分来确定。这样的可视化有助于比较PCA和LDA在降维和类别分离方面的效果,从而更直观地理解这两种方法在处理特定数据集时的特点和差异。最后,代码通过plt.show()显示这些图形。

完整源码

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams["axes.unicode_minus"] = False

# 加载Iris数据集
iris = datasets.load_iris()
X = iris.data  # Iris数据集的特征
y = iris.target  # 对应的标签
target_names = iris.target_names  # 目标类别的名称

# PCA降维处理
pca = PCA(n_components=2)  # 初始化PCA,设置降维后的主成分数目为2
X_r = pca.fit_transform(X)  # 对特征进行降维处理

# 打印PCA的方差解释比,显示每个主成分的重要性
print("PCA解释的方差比例:", pca.explained_variance_ratio_)

# LDA降维处理
lda = LinearDiscriminantAnalysis(n_components=2)  # 初始化LDA,设置降维后的成分数目为2
X_r2 = lda.fit_transform(X, y)  # 对特征进行降维处理,并使用标签信息

# 绘制PCA结果的散点图
plt.figure(figsize=(10, 5))
colors = ['navy', 'turquoise', 'darkorange']
lw = 2

for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=0.8, lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA对鸢尾花数据集的降维')

# 绘制LDA结果的散点图
plt.figure(figsize=(10, 5))
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=0.8, color=color, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('LDA对鸢尾花数据集的降维')

plt.show()
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐