当前位置: 首页 > news >正文

解锁机器学习核心算法|主成分分析(PCA):降维的魔法棒

一、引言

在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向量机、朴素贝叶斯算法、主成分分析(PCA)、神经网络。它们涵盖了回归、分类、聚类、降维等多个机器学习任务领域,是众多机器学习应用的基础和核心。

在这众多的算法中,主成分分析(Principal Component Analysis,简称 PCA)以其独特的魅力和广泛的应用,成为了机器学习领域中不可或缺的一员。它就像一位神奇的魔法师,能够对高维数据施展 “降维” 魔法,将复杂的数据简化,同时最大程度地保留数据的关键信息。 无论是在图像识别中对图像数据的处理,还是在数据分析中探索数据的潜在模式,PCA 都发挥着重要的作用,为解决各种实际问题提供了有效的手段 。接下来,就让我们一起深入探索主成分分析的奇妙世界,揭开它神秘的面纱。

二、PCA:降维的魔法棒

1、什么是主成分分析

主成分分析(Principal Component Analysis,PCA)是一种强大的数据分析技术,它的核心在于通过线性变换,将高维数据巧妙地转换为低维数据在这个转换过程中,数据的主要特征得以保留,同时数据的维度大幅减少,从而实现了数据的简化。

我们可以通过一个简单的例子来理解 PCA 的作用。假设我们有一组关于水果的数据,包含了水果的重量、大小、颜色、甜度、酸度等多个特征,这些特征构成了一个高维数据集。在实际分析中,我们可能会发现,其中一些特征之间存在着较强的相关性,比如重量和大小可能在一定程度上相互关联。PCA 的作用就是能够从这些众多的特征中,提取出最能代表数据差异的几个主成分。这些主成分是原始特征的线性组合,它们相互之间互不相关,并且能够最大程度地保留原始数据的信息。通过 PCA,我们可以将水果数据的多个特征转换为少数几个主成分,比如将上述的多个特征转换为两个主成分,这两个主成分就可以代表水果的主要特征,如第一个主成分可能主要反映水果的大小和重量等物理特征,第二个主成分可能主要反映水果的甜度和酸度等口味特征 。这样,我们就实现了数据的降维,使得后续的数据分析和处理更加高效和便捷。

2、PCA 的原理揭秘

PCA 的原理基于两个重要的概念:最大方差理论协方差矩阵与特征分解

2.1最大方差理论

PCA 基于最大方差理论,其核心思想是让数据在新的维度上投影的方差达到最大为什么要追求方差最大呢?在数据中,方差越大意味着数据在该方向上的分布越分散,包含的信息也就越多。我们可以想象一个二维平面上的数据点分布,如果数据点在某个方向上的投影非常集中,那么这个方向所包含的信息就相对较少;反之,如果数据点在某个方向上的投影非常分散,那么这个方向就包含了更多的数据信息。

在 PCA 中,我们通过寻找一组正交的向量,使得数据在这些向量上的投影方差最大。这些正交向量就是主成分的方向,而数据在这些方向上的投影就是主成分。具体来说,我们通过计算数据的协方差矩阵,然后对协方差矩阵进行特征值分解,得到特征值和特征向量。特征值表示了数据在对应特征向量方向上的方差大小,特征值越大,说明数据在该方向上的方差越大,包含的信息也就越多。我们按照特征值从大到小的顺序,选取前几个特征值对应的特征向量,这些特征向量就构成了主成分的方向。

2.2协方差矩阵与特征分解

协方差矩阵在 PCA 中起着关键的作用,它用于计算数据中各个特征之间的相关性对于一个包含多个特征的数据集,我们可以计算其协方差矩阵。协方差矩阵的对角线元素表示各个特征的方差,而非对角线元素表示不同特征之间的协方差。如果两个特征之间的协方差为 0,说明这两个特征相互独立;如果协方差不为 0,则说明这两个特征之间存在一定的相关性。

通过对协方差矩阵进行特征分解,我们可以得到特征值特征向量特征值反映了数据在对应特征向量方向上的方差大小,而特征向量则确定了主成分的方向。在实际应用中,我们通常会选择特征值较大的前几个特征向量,这些特征向量所对应的主成分能够最大程度地保留原始数据的信息。通过将原始数据投影到这些主成分上,我们就实现了数据的降维。 例如,对于一个三维的数据点集合,我们通过计算协方差矩阵并进行特征分解,得到三个特征值和对应的特征向量。假设这三个特征值分别为 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 λ 3 \lambda_3 λ3,且 λ 1 > λ 2 > λ 3 \lambda_1 > \lambda_2 > \lambda_3 λ1>λ2>λ3,那么我们可以选择前两个特征值对应的特征向量,将三维数据投影到由这两个特征向量所确定的二维平面上,从而实现从三维到二维的降维。

三、PCA 的实现步骤

1、数据预处理

在进行 PCA 之前,数据预处理是至关重要的一步。由于 PCA 对数据的尺度非常敏感,不同特征的量纲和数值范围可能存在较大差异,这会对分析结果产生显著影响。比如在一个包含身高(单位:厘米)和体重(单位:千克)的数据集里,如果不进行预处理,由于身高的数值范围通常在几十到两百多,而体重的数值范围一般在几十到一百多,PCA 算法可能会过度关注身高特征,因为其数值较大,从而忽略了体重特征的重要性。

为了消除这种影响,我们通常会对数据进行标准化处理,常见的标准化方法有均值标准化均方差标准化

  • 均值标准化是指将每个特征的值减去该特征的均值,使得数据的均值为 0 。
  • 均方差标准化则是在均值标准化的基础上,再除以该特征的标准差,这样处理后的数据均值为 0,方差为 1 。

通过标准化处理,所有特征都被统一到了相同的尺度上,保证了数据的一致性,使得 PCA 算法能够更加公平地对待每个特征,从而准确地提取出数据的主要特征。

2、计算协方差矩阵

经过数据预处理后,接下来就是计算协方差矩阵。协方差矩阵是一个非常关键的概念,它能够反映数据中各个特征之间的相关性。对于一个包含 n n n 个样本,每个样本有 m m m 个特征的数据集 X X X,其协方差矩阵 C C C 是一个 m × m m\times m m×m 的矩阵 。协方差矩阵的第 ( i , j ) (i, j) (i,j) 个元素 C i j C_{ij} Cij 表示第 i i i 个特征和第 j j j 个特征之间的协方差,计算公式为:

C i j = 1 n − 1 ∑ k = 1 n ( x k i − x ‾ i ) ( x k j − x ‾ j ) C_{ij}=\frac{1}{n - 1}\sum_{k = 1}^{n}(x_{ki}-\overline{x}_i)(x_{kj}-\overline{x}_j) Cij=n11k=1n(xkixi)(xkjxj)

其中, x k i x_{ki} xki 表示第 k k k 个样本的第 i i i 个特征值, x ‾ i \overline{x}_i xi 表示第 i i i 个特征的均值。

协方差矩阵的对角线元素 C i i C_{ii} Cii 表示第 i i i 个特征的方差,它反映了该特征自身的变化程度。而非对角线元素 C i j C_{ij} Cij i ≠ j i\neq j i=j)则表示第 i i i 个特征和第 j j j 个特征之间的协方差,

  • 如果协方差为正值,说明这两个特征之间存在正相关关系,即一个特征的值增大时,另一个特征的值也倾向于增大;
  • 如果协方差为负值,则说明这两个特征之间存在负相关关系,即一个特征的值增大时,另一个特征的值倾向于减小;
  • 如果协方差为 0,则表示这两个特征之间相互独立,没有线性关系

在 PCA 中,通过分析协方差矩阵,我们可以了解数据中各个特征之间的内在联系,为后续提取主成分提供重要依据。

3、特征值分解与排序

计算得到协方差矩阵后,下一步就是对协方差矩阵进行特征值分解。特征值分解是线性代数中的一个重要操作,对于一个 m × m m\times m m×m 的协方差矩阵 C C C,通过特征值分解可以得到 m m m 个特征值 λ 1 , λ 2 , ⋯ , λ m \lambda_1,\lambda_2,\cdots,\lambda_m λ1,λ2,,λm 和对应的 m m m 个特征向量 v 1 , v 2 , ⋯ , v m v_1,v_2,\cdots,v_m v1,v2,,vm 。这些特征值和特征向量满足以下关系:

C v i = λ i v i Cv_i=\lambda_iv_i Cvi=λivi

其中, i = 1 , 2 , ⋯ , m i = 1,2,\cdots,m i=1,2,,m。特征值 λ i \lambda_i λi 表示数据在特征向量 v i v_i vi 方向上的方差大小,方差越大,说明数据在该方向上的分布越分散,包含的信息也就越多。特征向量 v i v_i vi则确定了数据的主要方向,即主成分的方向

在得到所有的特征值和特征向量后,我们需要按照特征值的大小对它们进行排序。通常将特征值从大到小进行排列,这样排在前面的特征值对应的特征向量就是我们关注的重点,因为它们包含了数据中更多的信息。 例如,假设我们得到的特征值分别为 λ 1 = 10 \lambda_1 = 10 λ1=10 λ 2 = 5 \lambda_2 = 5 λ2=5 λ 3 = 1 \lambda_3 = 1 λ3=1,那么对应的特征向量 v 1 v_1 v1 所代表的方向就是数据中方差最大的方向,包含的信息最多, v 2 v_2 v2 所代表的方向方差次之, v 3 v_3 v3 所代表的方向方差最小,包含的信息也相对较少。通过排序,我们可以清晰地了解各个主成分的重要程度,为后续选择主成分提供直观的依据。

4、主成分选择

根据特征值排序的结果,我们就可以选择主成分了。选择主成分的依据主要有两个:特征值大小累计贡献率

特征值大小直接反映了主成分包含信息的多少,特征值越大,说明该主成分所代表的方向上数据的方差越大,包含的信息也就越多。因此,我们通常会优先选择特征值较大的主成分。例如,在前面的例子中,我们会首先选择 λ 1 \lambda_1 λ1 对应的特征向量 v 1 v_1 v1 作为主成分,因为它包含的信息最多。

累计贡献率是另一个重要的选择依据,它是指前 k k k 个特征值的和占总特征值和的比例。计算公式为:

累计贡献率 = ∑ i = 1 k λ i ∑ i = 1 m λ i 累计贡献率=\frac{\sum_{i = 1}^{k}\lambda_i}{\sum_{i = 1}^{m}\lambda_i} 累计贡献率=i=1mλii=1kλi

通常,我们会设定一个累计贡献率的阈值,如 80% 或 90% 。当选择的前 k k k 个主成分的累计贡献率达到或超过这个阈值时,就认为这 k k k 个主成分已经能够足够代表原始数据的主要信息,可以将它们作为最终的主成分。例如,假设有 5 个特征值,分别为 λ 1 = 10 \lambda_1 = 10 λ1=10 λ 2 = 5 \lambda_2 = 5 λ2=5 λ 3 = 3 \lambda_3 = 3 λ3=3 λ 4 = 1 \lambda_4 = 1 λ4=1 λ 5 = 0.5 \lambda_5 = 0.5 λ5=0.5,总特征值和为 10 + 5 + 3 + 1 + 0.5 = 19.5 10 + 5 + 3 + 1 + 0.5 = 19.5 10+5+3+1+0.5=19.5。如果我们设定累计贡献率阈值为 80%,那么计算前 3 个特征值的累计贡献率为 ( 10 + 5 + 3 ) ÷ 19.5 ≈ 92.3 % (10 + 5 + 3) \div 19.5 \approx 92.3\% (10+5+3)÷19.592.3%,超过了 80%,所以我们可以选择前 3 个主成分,即 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 λ 3 \lambda_3 λ3 对应的特征向量作为最终的主成分。

5、数据转换

在选择好主成分后,最后一步就是将原始数据投影到选定的主成分上,实现数据的降维。假设我们选择了 k k k 个主成分,对应的特征向量组成了一个 m × k m\times k m×k 的矩阵 W W W(其中 m m m是原始特征的数量),原始数据矩阵为 X X X n × m n\times m n×m n n n 为样本数量) 。那么,将原始数据投影到主成分上的计算过程如下:

Y = X W Y = XW Y=XW

其中, Y Y Y 就是降维后的数据矩阵,它的大小为 n × k n\times k n×k 。通过这个投影操作,我们将原始的高维数据 X X X 转换到了由 k k k 个主成分构成的低维空间中,实现了数据的降维。在这个低维空间中,数据保留了原始数据的主要信息,同时减少了数据的维度,降低了数据处理的复杂度,为后续的数据分析和机器学习任务提供了更加简洁高效的数据表示。 例如,对于一个原本是 10 维的数据,经过 PCA 选择了 3 个主成分后,就可以将这 10 维数据投影到由这 3 个主成分构成的 3 维空间中,得到一个 3 维的数据表示,大大简化了数据的处理难度。

四、PCA 实例代码解析

1、Python 实现 PCA

在 Python 中,我们可以使用 sklearn 库来轻松实现 PCA。sklearn 是一个功能强大的机器学习库,提供了丰富的工具和算法,其中的 decomposition 模块包含了 PCA 的实现。下面我们通过一个简单的代码示例来展示如何使用sklearn进行 PCA 操作。

首先,我们需要导入必要的库,包括 numpy 用于数值计算,pandas 用于处理数据,sklearn.datasets 用于加载数据集,sklearn.decomposition 中的PCA用于主成分分析,以及 sklearn.preprocessing 中的 StandardScaler 用于数据标准化。

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

我们还是加载鸢尾花数据集,可以使用 sklearn.datasetsload_iris 函数加载数据:

iris = load_iris()

接下来,我们需要提取数据中的特征部分(不包括标签列,如果有的话)。假设我们的数据集中,最后一列是标签列,那么我们可以这样提取特征

X = iris.data
y = iris.target
labels = iris.target_names

在进行 PCA 之前,对数据进行标准化是非常重要的步骤。我们使用 StandardScaler 对数据进行标准化处理:

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

现在,我们可以创建一个 PCA 对象,并指定我们希望保留的主成分数量。例如,如果我们希望将数据降维到 2 维,可以这样创建 PCA 对象

# 应用PCA降到2维
pca = PCA(n_components=2)

这里的 n_components 参数指定了我们要保留的主成分数量。它可以是一个整数,表示具体的主成分数量;也可以是一个介于 0 到 1 之间的浮点数,表示保留的方差贡献率。例如,n_components=0.95 表示保留能够解释 95% 方差的主成分数量。

然后,我们使用 PCA 对象对标准化后的数据进行拟合和转换,得到降维后的数据:

X_pca = pca.fit_transform(X_scaled)

最后,我们可以将降维后的数据转换为 pandasDataFrame 格式,以便更方便地查看和处理:

X_pca_df = pd.DataFrame(X_pca, columns=['PC1', 'PC2'])print(X_pca_df.head())

输出结果
在这里插入图片描述

2、数据可视化

为了更直观地理解 PCA 的效果,我们可以将降维后的数据进行可视化。在 Python 中,常用的可视化库有 matplotlibseaborn。下面我们使用 matplotlib 将降维后的数据绘制在二维平面上。

import matplotlib.pyplot as plt# 可视化结果
plt.figure(figsize=(8, 6))# 不同类别使用不同的颜色绘制
for i, label in enumerate(labels):plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=label)plt.title("PCA of Iris Dataset")
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.legend()
plt.show()

上述代码中:

  • plt.scatter 函数用于绘制散点图
  • plt.xlabelplt.ylabel 分别设置 x 轴和 y 轴的标签
  • plt.title设置图表的标题,最后plt.show显示图表。
    在这里插入图片描述

通过这个散点图,我们可以直观地看到数据在降维后的分布情况,不同的数据点在主成分 1 和主成分 2 所构成的二维平面上的位置关系,从而更好地理解 PCA 对数据的降维效果。 例如,如果数据在降维后呈现出明显的聚类结构,那么我们可以通过这个散点图清晰地观察到这些聚类。

五、PCA 的应用场景

1、数据压缩

在数字化时代,数据量的爆炸式增长给存储和传输带来了巨大的挑战。PCA 作为一种强大的数据降维技术,在数据压缩领域发挥着重要作用。以图像处理为例,一张普通的彩色照片可能包含成千上万的像素点,每个像素点又具有多个颜色通道(如 RGB),这使得图像数据的维度非常高。如果直接存储这些原始数据,不仅需要大量的存储空间,而且在传输和处理时也会消耗大量的时间和计算资源。

通过 PCA,我们可以对图像数据进行降维处理。PCA 能够找到图像数据中的主要特征方向,将图像投影到这些主成分上,从而实现数据的压缩。在人脸识别系统中,需要处理大量的人脸图像数据,这些图像数据的维度通常很高。通过 PCA 降维,可以将高维的人脸图像数据压缩到低维空间,大大减少了存储空间的需求。同时,在进行人脸识别时,由于数据维度的降低,计算量也显著减少,从而提升了识别速度,使得系统能够更快速地对人脸进行识别和验证。

2、数据可视化

人类的认知能力在处理高维数据时存在很大的局限性,我们很难直观地理解和分析高维数据中的模式和关系。PCA 可以将高维数据转换为二维或三维空间,使得数据可以可视化展示,便于人类观察和理解。在数据分析和机器学习项目中,经常需要将高维数据可视化以便于理解和解释。

例如,在分析用户行为数据时,可能会收集到用户的年龄、性别、消费金额、购买频率等多个维度的信息。这些高维数据很难直接看出其中的规律和趋势。通过 PCA 将这些数据降至二维或三维,然后使用散点图、热力图等工具进行可视化,我们就可以直观地看到不同用户群体在二维或三维空间中的分布情况,发现其中的聚类、异常值等信息,从而更好地理解用户行为,为业务决策提供有力支持。

3、特征提取

在机器学习和数据挖掘中,数据往往包含大量的特征,其中一些特征可能是冗余的或者对模型的贡献较小。PCA 通过降维的方式提取出最具代表性的特征,去除冗余信息,从而提高模型的性能和效率。在文本分类任务中,原始文本数据通常包含大量的词汇,这些词汇构成了高维的特征空间。然而,并不是所有的词汇都对文本的分类具有重要意义,其中很多词汇可能是常见的、无区分性的词汇。

通过 PCA,可以对这些高维的文本特征进行降维处理,提取出最能代表文本主题和情感的词汇作为特征。这些经过 PCA 提取的特征能够更好地反映文本的本质特征,去除了大量的噪声和冗余信息,从而提高了文本分类器的性能,使得分类器能够更准确地对文本进行分类。

4、处理大型数据集

随着科技的发展,在许多领域中都产生了大量的数据,这些数据不仅规模庞大,而且维度很高,给数据处理和分析带来了极大的挑战。在生物信息学领域,基因表达数据通常包含成千上万的基因,维度非常高。分析这些高维的基因表达数据是一个巨大的挑战,传统的分析方法往往难以处理如此大规模和高维度的数据。

PCA 能够提供有效的降维和特征提取方法,使得数据更易于处理和分析。通过 PCA 可以将这些高维的基因表达数据降至较低的维度,在降低维度的同时保留数据的主要特征和信息。这样,研究人员就可以更容易地对降维后的数据进行聚类分析、差异表达分析等,从而发现基因之间的潜在关系,揭示生物过程中的关键基因和功能,为生物医学研究提供重要的支持。

六、PCA 的优缺点分析

1、优点

  • 降维PCA 能够将高维数据转换为低维数据,减少数据的维度,降低数据处理的复杂度。这在处理大规模数据或高维数据时非常有效,能够显著提高计算效率,减少存储空间的需求。在图像识别领域,图像数据通常具有很高的维度,通过 PCA 降维,可以将图像数据压缩到较低的维度,使得后续的处理和分析更加高效。

  • 消除噪声和冗余PCA 通过提取数据的主要特征,能够去除数据中的噪声和冗余信息,提高数据的质量。在数据分析中,数据往往包含一些噪声和无关紧要的信息,这些信息会干扰分析结果的准确性。PCA 可以有效地过滤掉这些噪声和冗余,使得分析结果更加可靠。

  • 发现数据隐藏结构和模式PCA 可以帮助我们发现数据中潜在的结构和模式,通过将数据投影到主成分上,我们可以观察到数据在不同维度上的分布情况,从而揭示数据之间的内在关系。在市场调研数据中,通过 PCA 分析可以发现不同消费者群体在多个维度上的特征差异,为市场细分和精准营销提供依据。

2、缺点

  • 只适用于线性数据PCA 是一种线性降维方法,它假设数据之间的关系是线性的。对于非线性数据,PCA 可能无法有效地提取数据的特征,降维效果会受到很大影响。在一些复杂的数据集,如包含复杂曲线关系的数据,PCA 的处理能力就会显得力不从心。

  • 可能丢失重要信息在降维过程中,PCA 只保留了方差较大的主成分,而方差较小的成分可能会被忽略。然而,这些方差较小的成分可能包含了对某些任务非常重要的信息,丢弃它们可能会导致信息的丢失,影响模型的性能。在医疗诊断数据中,一些看似不重要的特征可能对疾病的诊断有着关键的作用,但在 PCA 降维过程中可能会被舍去。

  • 计算复杂度高PCA 的计算过程涉及到协方差矩阵的计算和特征值分解,对于大规模的高维数据集,这些计算的复杂度较高,需要消耗大量的计算资源和时间。当数据量非常大且维度很高时,PCA 的计算时间会显著增加,甚至可能无法在合理的时间内完成计算。

七、总结与展望

主成分分析作为机器学习领域中一种经典且强大的算法,以其独特的降维能力和广泛的应用场景,在数据处理和分析中占据着重要的地位。通过对 PCA 原理的深入剖析,我们了解到它基于最大方差理论和协方差矩阵的特征分解,能够巧妙地将高维数据转换为低维数据,在保留数据主要特征的同时,实现数据的简化和去噪。

在实现步骤上,从数据预处理的标准化操作,到协方差矩阵的计算、特征值分解与排序,再到主成分的选择以及最终的数据转换,每一个步骤都紧密相连,共同构成了 PCA 算法的核心流程。通过 Python 代码的实现和数据可视化,我们更加直观地感受到了 PCA 在实际应用中的效果,它能够将复杂的数据以更加简洁、直观的方式呈现出来,为我们的数据分析和决策提供有力支持。

在应用场景方面,PCA 展现出了强大的适应性和实用性。无论是在数据压缩中减少存储空间和计算复杂度,还是在数据可视化中帮助我们更好地理解高维数据的分布和模式;无论是在特征提取中去除冗余信息,提高机器学习模型的性能,还是在处理大型数据集时降低数据处理的难度,PCA 都发挥着不可或缺的作用。

然而,我们也必须认识到 PCA 的局限性,如它仅适用于线性数据,在降维过程中可能会丢失重要信息,并且计算复杂度较高。但随着技术的不断发展和研究的深入,相信未来会有更多针对 PCA 的改进和优化方法出现。例如,将 PCA 与其他非线性降维方法相结合,以处理更复杂的数据结构;研究更高效的计算算法,降低计算复杂度,提高算法的运行效率。同时,随着大数据和人工智能技术的飞速发展,PCA 在更多领域的应用也将得到进一步拓展和深化,为解决各种实际问题提供更多的可能性。


延伸阅读

  • 机器学习核心算法系列文章

    解锁机器学习核心算法|朴素贝叶斯:分类的智慧法则
    解锁机器学习核心算法 | 支持向量机算法:机器学习中的分类利刃
    解锁机器学习核心算法 | 随机森林算法:机器学习的超强武器
    解锁机器学习核心算法 | K -近邻算法:机器学习的神奇钥匙
    解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
    解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器
    解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
    解锁机器学习核心算法 | 线性回归:机器学习的基石

  • 深度学习框架探系列文章

    深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
    深度学习框架探秘|PyTorch:AI 开发的灵动画笔
    深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
    深度学习框架探秘|Keras:深度学习的魔法钥匙

相关文章:

解锁机器学习核心算法|主成分分析(PCA):降维的魔法棒

一、引言 在机器学习的庞大算法体系中,有十种算法被广泛认为是最具代表性和实用性的,它们犹如机器学习领域的 “十大神器”,各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…...

sql注入漏洞

目录 一、SQL注入概述 例子背景 正常情况下的查询 SQL注入攻击 利用优先级进行攻击 二、解决SQL注入 使用PreparedStatement接口 步骤和方法 1. 创建PreparedStatement对象 2. 向占位符传入值 3. 执行SQL语句 示例 总结 SQL 注入是一种常见的网络攻击手段。通俗来…...

spring微服务+dubbo框架,某一服务启动时提示多个bean存在

在java的springboot项目中使用DubboService的注解的实现类中,在引用本模块的类时,使用的DubboRefrence注解,在启动项目时报错,提示该类需要以一个bean对象,但是存在了两个,把DubboRefrence的注解改成Autowi…...

React useState 和 useEffect 使用坑点注意总结

React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…...

使用rknn进行yolo11-pose部署

文章目录 概要生成ONNX生成RKNN实测效果概要 使用 RKNN 进行 YOLOv11 Pose 部署的必要性在于,RKNN 能将 YOLOv11 Pose 模型转化为适合 Rockchip 硬件平台(如 RV1109、RV1126)执行的格式,充分利用其 AI 加速功能,显著提高推理速度和效率。此外,RKNN 提供模型优化(如量化…...

开源语音克隆项目 OpenVoice V2 本地部署

#本机环境 WIN11 I5 GPU 4060ti 16G 内存 32G #开始 git clone https://github.com/myshell-ai/OpenVoice.git conda create -n opvenv python3.9 -y conda activate opvenv pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/…...

YOLOv12从入门到入土(含结构图)

论文链接:https://arxiv.org/abs/2502.12524 代码链接:https://github.com/sunsmarterjie/yolov12 文章摘要: 长期以来,增强YOLO框架的网络架构一直至关重要,但一直专注于基于cnn的改进,尽管注意力机制在建…...

8.【线性代数】——求解Ax=b

八 求解Axb 1. 解Axb求特解 x p x_p xp​求特解 x n x_n xn​所有解 2. Axb什么时候有解3. A m ∗ n A_{m * n} Am∗n​不同秩的Axb解分析3.1 列满秩 rn<m3.2 行满秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 综述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…...

【Quest开发】全身跟踪

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 最终效果&#xff1a;能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势&#xff0c;实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …...

Spring Boot 示例项目:从零开始构建 Web 应用

一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...

Windows 启动 SSH 服务报错 1067

Windows 启动 SSH 服务报错 1067 一、原本安装的 Windows 自带的 SSH 服务 按 Windows 键 -> 设置 -> 系统 -> 可选功能 在 添加的功能 查看是否安装了 OpenSSH 服务 一开始 执行 net start sshd 是可以正常启动的 并且其他机器也可以通过 ssh 访问 这个电脑 但是有…...

【AI战略思考15】我对做自媒体视频博主的初步探索和一些思考

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 导言 因为自己找工作可能没那么快和顺利&#xff0c;事实是比我之前想象的要难很多&#xff0c;所以这几天探索了下自己能否尝试做自媒体或者视频博主来尝试赚点钱&#xff0c;如果做…...

零基础学QT、C++(一)安装QT

目录 如何快速学习QT、C呢&#xff1f; 一、编译器、项目构建工具 1、编译器&#xff08;介绍2款&#xff09; 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢&#xff1f; 那就是项目驱动法&…...

Word接入DeepSeek(API的作用)

1.打开”Word”&#xff0c;点击“文件”。 2.点击“选项”。 3.点击“信任中心”——“信任中心设置”。 4. 勾选”启用所有宏“&#xff0c;点击”确定“。 5.点击“自定义功能区”&#xff0c;勾选上“开发工具”&#xff0c;点击“确定”。 6.返回“文件——开发工具“下的…...

ok113i——交叉编译音视频动态库

提示&#xff1a;buildroot支持ffmpeg和SDL&#xff0c;但博主的ffmpeg是按下面方法编译通过&#xff0c;SDL使用buildroot直接编译也通过&#xff1b; 1. 下载ffmpeg源码 下载链接&#xff1a;https://github.com/FFmpeg/FFmpeg/tags 根据版本需要自行下载压缩包&#xff0c…...

CSS中五种定位方式(position)对比分析

在 CSS 中&#xff0c;定位方式&#xff08;position&#xff09;决定了元素如何相对于其参照物进行定位&#xff0c;同时影响文档流的布局。以下是五种定位方式的对比、参照物说明及代码示例&#xff1a; 1. position: static&#xff08;默认定位&#xff09; 参照物&#x…...

Jest单元测试

由于格式和图片解析问题&#xff0c;可前往 阅读原文 前端自动化测试在提高代码质量、减少错误、提高团队协作和加速交付流程方面发挥着重要作用。它是现代软件开发中不可或缺的一部分&#xff0c;可以帮助开发团队构建可靠、高质量的应用程序 单元测试&#xff08;Unit Testi…...

Lineageos 22.1(Android 15) 开机向导制作

一、前言 开机向导原理其实就是将特定的category的Activity加入ComponentResolver&#xff0c;如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我们开机启动的时候&#xff0c;FallbackHome结束&#xff0c;然后启动Launcher的时候…...

前沿计组知识入门

这份PDF文件是一份关于计算机体系结构的讲义&#xff0c;涵盖了从基础概念到高级主题的多个方面。以下是详细的总结和分析&#xff1a; 计算机体系结构概述 定义&#xff1a;计算机体系结构是计算机系统的理论组成部分&#xff0c;根据其属性和功能进行划分&#xff0c;包括计…...

力扣 最长递增子序列

动态规划&#xff0c;二分查找。 题目 由题&#xff0c;从数组中找一个最长子序列&#xff0c;不难想到&#xff0c;当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看&#xff0c;当遍历到这个数&#xff0c;会从前面的dp选一个最大的数加上当前数&#xff0c;注意…...

在项目中调用本地Deepseek(接入本地Deepseek)

前言 之前发表的文章已经讲了如何本地部署Deepseek模型&#xff0c;并且如何给Deepseek模型投喂数据、搭建本地知识库&#xff0c;但大部分人不知道怎么应用&#xff0c;让自己的项目接入AI模型。 文末有彩蛋哦&#xff01;&#xff01;&#xff01; 要接入本地部署的deepsee…...

已解决IDEA无法输入中文问题(亲测有效)

前言 在使用IDEA的时候&#xff0c;比如我们想写个注释&#xff0c;可能不经意间&#xff0c;输入法就无法输入中文了&#xff0c;但是在其他地方打字&#xff0c;输入法仍然能够正常工作。这是什么原因呢&#xff0c;这篇文章带你解决这个问题&#xff01; 快捷键 如果你的I…...

Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨

一、Records&#xff08;Java 16&#xff09; &#x1f4dd; 核心价值&#xff1a;简化不可变数据载体的定义 // 传统POJO vs Record public record User(String name, int age) {} // 自动生成&#xff1a;构造方法/equals()/hashCode()/toString() User user new User(&qu…...

书评与笔记:《如何有效报告Bug》

文章目录 书评笔记核心原则1. 首要目标&#xff1a;让程序员亲眼看到问题2. 次要目标&#xff1a;详细描述问题3. 保持冷静&#xff0c;避免误操作4. 提供额外信息5. 清晰、准确地表达 实用建议不要自作聪明地诊断问题类比&#xff1a;看医生时的症状描述程序员的心理 总结 原文…...

Node.js 中的 fs 模块详解

fs&#xff08;File System&#xff09;模块是 Node.js 的核心模块之一&#xff0c;用于处理文件系统的操作&#xff0c;包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式&#xff0c;适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...

【深度学习】如何一步步实现SGD随机梯度下降算法

如何一步步实现SGD随机梯度下降算法 文章目录 如何一步步实现SGD随机梯度下降算法SGD随机梯度下降算法的作用MNIST_SAMPLE数据集SGD算法的七大步骤Step1. 初始化模型参数Step2. 计算预测值predictionsStep3. 计算损失lossStep4. 计算梯度gradientsStep5. 更新模型参数Step6. 重…...

Android Hal AIDL 简介 (一)

Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…...

【数据分析】2.数据分析业务全流程

业务流程方法论&#xff1a;3阶段6步骤 一、课程核心内容结构 1. 方法论概述 目标&#xff1a;系统性地解决商业中的关键问题框架&#xff1a;分为三个阶段&#xff0c;每个阶段包含两个步骤适用场景&#xff1a;适用于数据分析师、业务经理等需要通过数据分析支持决策的从业…...

如何使用Spark SQL进行复杂的数据查询和分析

使用Spark SQL进行复杂的数据查询和分析是一个涉及多个步骤和技术的过程。以下是如何使用Spark SQL进行复杂数据查询和分析的详细指南&#xff1a; 一、准备阶段 环境搭建&#xff1a; 确保已经安装并配置好了Apache Spark环境。准备好数据源&#xff0c;可以是CSV文件、JSON…...

【Spring+MyBatis】_图书管理系统(下篇)

图书管理系统上篇、中篇如下&#xff1a; 【SpringMyBatis】_图书管理系统&#xff08;上篇&#xff09;-CSDN博客 【SpringMyBatis】_图书管理系统&#xff08;中篇&#xff09;-CSDN博客 目录 功能5&#xff1a;删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…...

goland无法debug项目

1、其实个原因是因为正在使用的Delve调试器版本太旧&#xff0c;无法兼容当前的Go语言版本1.2。Delve是Go语言的一个调试工具&#xff0c;用于提供源码级别的调试功能。Go语言每隔一段时间会发布新版本&#xff0c;而相应的调试器Delve也可能会更新以提供新的特性或修复已知问题…...

001-监控你的文件-FSWatch-C++开源库108杰

fswatch 原理与应用简介fswatch 安装fswatch 实践应用具体应用场景与细节补充 1. 简介 有些知识&#xff0c;你知道了不算厉害&#xff0c;但你要是不知道&#xff0c;就容易出乱。 很多时候&#xff0c;程序需要及时获取磁盘上某个文件对象&#xff08;文件夹、文件&#xff0…...

leetcode203.移除链表元素

目录 问题描述示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 题目链接&#xff1a;移除链表元素 示例 提示 列表中的节点数目在范围…...

代码随想录算法训练营第六天| 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数 、1. 两数之和

242.有效的字母异位词 题目链接&#xff1a;242.有效的字母异位词 文档讲解&#xff1a;代码随想录有效的字母异位词 视频讲解&#xff1a;LeetCode&#xff1a;有效的字母异位词 状态&#xff1a;学会了 思路&#xff1a; 数组其实是简单哈希表。 哈希表用来快速判断元素是否在…...

DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门

1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second&#xff0c;每秒浮点运算次数&#xff0c;用来衡量硬件性能。 FLOPs&#xff1a;floating point of operations&#xff0c;是浮点运算次数&#xff0c;用来衡量算法、模型的复杂度。 GFLOPS&#xff…...

rknn 板端运行程序Invalid RKNN model version 6, Meet unsupported rknn target type

E RKNN: [09:15:53.053] 6, 1 E RKNN: [09:15:53.053] Invalid RKNN model version 6 E RKNN: [09:15:53.053] rknn_init, load model failed! [NN_ERROR] rknn_init fail! ret-1 或者报错&#xff1a; E RKNN: [08:35:30.804] Meet unsupported target type: 0x46495247 E…...

Linux 内核中的 container_of 宏:以 ipoib_rx_poll_rss 函数为例

在 Linux 内核编程中,container_of 是一个非常实用的宏,主要用于通过结构体的成员指针来获取包含该成员的整个结构体的指针。rx_ring = container_of(napi, struct ipoib_recv_ring, napi); 在代码中就是利用了这个宏,下面我们详细分析它的作用和工作原理。 背景知识 在内…...

【数据结构-红黑树】

文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff08;Binary Search Tree, BST&#xff09;&…...

一个简洁高效的Flask用户管理示例

Flask-Login 是 Flask 的用户管理扩展&#xff0c;提供 用户身份验证、会话管理、权限控制 等功能。 适用于&#xff1a; • 用户登录、登出 • 记住用户&#xff08;“记住我” 功能&#xff09; • 限制未登录用户访问某些页面 • 用户会话管理 1. 安装 Flask-Login pi…...

用Nginx打造防盗链护盾

用Nginx打造防盗链护盾 一、你的网站正在"为他人做嫁衣"&#xff1f; 想象一下这个场景&#xff1a; 你精心拍摄的摄影作品、录制的课程视频、设计的原创素材&#xff0c;被其他网站直接盗用链接。 更气人的是——当用户在他们网站查看这些资源时&#xff0c;消耗的…...

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…...

【Java】Enum类的常用方法、实现接口及其实际应用

Enum类的常用方法 package com.star.enum03;/** * author : Starshine */public class TestSeason { //这是一个main方法&#xff0c;是程序的入口&#xff1a; public static void main(String[] args) { //用enum关键字创建的Season枚举类上面的父类是&#xff…...

Linux | 进程控制(进程终止与进程等待)

文章目录 Linux | 进程控制 — 进程终止 & 进程等待1、进程终止进程常见退出方法1.1退出码基本概念获取退出码的方式常见退出码约定使用场景 1.2 strerror函数 & errno宏1.3 _exit函数1.4_exit和exit的区别1.4.1 所属头文件与函数原型1.4.2 执行过程差异**结合现象分析…...

三、tsp学习笔记——屏幕移植

泰山派-6寸猫屏转接板 - 立创开源硬件平台 泰山派樱猫的教程&#xff0c;屏资料链接: https://pan.baidu.com/s/1pNAKH33r7LtZG6EwHJ-HNA?pwdnsde 提取码: nsde &#xff08;不要浪费时间下载&#xff0c;没有用&#xff0c;下载gitee上的&#xff09; leefei/tspi-disp-6…...

python全栈-python进阶

python进阶 文章目录 python进阶异常except自定义异常类 文件操作序列化和反序列化CSV文件os模块os.path模块shutil模块 拷贝压缩 模块--modulefrom 模块 import 成员包package库LibraryPIP库 GUI编程-tkinter版使用类定义的GUI界面设置控件的属性方式Label标签的常用属性Butto…...

SpringBoot如何配置开发环境(JDK、Maven、IDEA等)

目录 1. 安装JDK 一、JDK介绍JRE&#xff08;Java Runtime Envirnment&#xff09;&#xff1a;Java运行环境 二、下载JDK官网地址&#xff1a;Java Downloads | Oracle 三、安装JDK点击下载下来的安装包进行安装 四、配置JDK进入到环境变量中&#xff08;下面介绍两种进入…...

图片粘贴上传实现

图片上传 html demo 直接粘贴本地运行查看效果即可&#xff0c;有看不懂的直接喂给 deepseek 会解释的很清晰 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…...

C++--STL库-List

目录 1.list 的基本使用 1.1 创建和初始化 1.2. 插入元素 1.3. 删除元素 1.4. 访问元素 1.5 遍历 1.6 总结 list是C标准库&#xff08;STL&#xff09;中的双向链表容器&#xff0c;属于<list>头文件。 它的特点是&#xff1a; 动态大小&#xff1a;可以随时插入…...

kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决

kubeadm拉起的k8s集群证书过期的做法 这个是很久之前遇到的了&#xff0c;今天有空&#xff08;心血来潮&#xff09;就都回忆回忆写在这里为爱发光&#xff0c;部分内容来自arch先生&#xff08;死党&#xff09;的帮助。有时候有很多部门提了建k8s的需求&#xff0c;有些是临…...