人工智能 — 特征选择、特征提取、PCA

目录

  • 一、特征选择
    • 1、定义
    • 2、原因
    • 3、做法
    • 4、生成过程
    • 5、停止条件
  • 二、特征提取
  • 三、PCA 算法
    • 1、零均值化(中心化)
    • 2、方差
    • 3、协方差
    • 4、协方差矩阵
    • 5、对协方差矩阵求特征值、特征矩阵
    • 6、对特征值进行排序
    • 7、评价模型
    • 8、代码实现
    • 9、sklearn 库
    • 10、鸢尾花实例
    • 11、优缺点

一、特征选择

1、定义

从 N 个特征中选择其中 M(M<=N)个子特征,并且在 M 个子特征中,准则函数(实现目标)可以达到最优解。

卷积负责提取图像中的局部特征。

特征选择想要做的是:

选择尽可能少的子特征,模型的效果不会显著下降,并且结果的类别分布尽可能的接近真实的类别分布。

2、原因

在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型

  • 相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果。

  • 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升。

  • 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其它的特征推断出。

同一特征在不同业务场景下可以是不同类型的特征。

但是对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。

进行特征选择的主要目的

  • 降维(例如把100个特征减少为50个)
  • 降低学习任务的难度
  • 提升模型的效率

3、做法

特征选择主要包括四个过程

  • 生成过程:生成候选的特征子集。
  • 评价函数:评价特征子集的好坏。
  • 停止条件:决定什么时候该停止。
  • 验证过程:特征子集是否有效。

在这里插入图片描述

4、生成过程

生成过程是一个搜索过程,这个过程主要有以下三个策略

  • 完全搜索:根据评价函数做完全搜索。完全搜索主要分为穷举搜索和非穷举搜索。
  • 启发式搜索:根据一些启发式规则在每次迭代时,决定剩下的特征是应该被选择还是被拒绝。这种方法很简单并且速度很快。
  • 随机搜索:每次迭代时会设置一些参数,参数的选择会影响特征选择的效果。由于会设置一些参数(例如最大迭代次数)。

5、停止条件

停止条件用来决定迭代过程什么时候停止,生成过程和评价函数可能会对于怎么选择停止条件产生影响。停止条件有以下四种选择:

  • 达到预定义的最大迭代次数。
  • 达到预定义的最大特征数。
  • 增加(删除)任何特征不会产生更好的特征子集。
  • 根据评价函数,产生最优特征子集。

二、特征提取

特征:常见的特征有边缘、角、区域等。

特征提取:是通过属性间的关系,如组合不同的属性得到新的属性,这样就改变了原来的特征空间。

特征选择:是从原始特征数据集中选择出子集,是一种包含的关系,没有更改原始的特征空间。

目前图像特征的提取主要有两种方法

  • 传统的特征提取方法:基于图像本身的特征进行提取。
  • 深度学习方法:基于样本自动训练出区分图像的特征分类器。

特征选择(feature selection)和特征提取(Feature extraction)都属于降维(Dimension reduction)。

三、PCA 算法

当我们处理高维数据时,往往存在冗余信息和噪声,这使得数据分析和模型训练变得更加困难。主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,通过线性变换将高维数据映射到低维空间,从而保留数据中最重要的信息。

原理

就是将数据从原始的空间中转换到新的特征空间中。

例如原始的空间是三维的 (x,y,z),x、y、z 分别是原始空间的三个基,通过 PCA 算法,用新的坐标系 (a,b,c) 来表示原始的数据,那么 a、b、c 就是新的基,它们组成新的特征空间。

在新的特征空间中,可能所有的数据在 c 上的投影都接近于 0,即可以忽略,那么我们就可以直接用 (a,b) 来表示数据,这样数据就从三维的 (x,y,z) 降到了二维的 (a,b)。

步骤

1、对原始数据零均值化(中心化)。

2、求协方差矩阵。

3、对协方差矩阵求特征向量和特征值,这些特征向量组成了新的特征空间。

1、零均值化(中心化)

中心化即是指变量减去它的均值,使均值为0。

其实就是一个平移的过程,平移后使得所有数据的中心是(0,0)。

在这里插入图片描述

只有中心化数据之后,计算得到的方向才能比较好的“概括”原来的数据。此图形象的表述了,中心化的几何意义,就是将样本集的中心平移到坐标系的原点O上。

在这里插入图片描述

2、方差

对于一组数据,如果它在某一坐标轴上的方差越大,说明坐标点越分散,该属性能够比较好的反映源数据。

s 2 = ∑ i = 1 n ( X i − X ˉ ) 2 n − 1 s^2 = \frac{\sum_{i=1}^{n} (X_i - \bar{X})^2}{n-1} s2=n1i=1n(XiXˉ)2

PCA 算法的优化目标

  • 降维后同一维度的方差最大。

  • 不同维度之间的相关性为 0。

3、协方差

协方差就是一种用来度量两个随机变量关系的统计量。

同一元素的协方差就表示该元素的方差,不同元素之间的协方差就表示它们的相关性。
Cov ( X , Y ) = ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) n − 1 \text{Cov}(X, Y) = \frac{\sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})}{n-1} Cov(X,Y)=n1i=1n(XiXˉ)(YiYˉ)
协方差的性质:

1、Cov(X,Y) = Cov(Y,X)

2、Cov(aX,bY) = abCov(Y,X) (a,b是常数)

3、Cov(X1+X2,Y) = Cov(X1,Y)+Cov(X2,Y)

由Cov ( X , Y ) = ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) n − 1 和 s 2 = ∑ i = 1 n ( X i − X ˉ ) 2 n − 1 可看出: C o v ( X , X ) = D ( X ) , C o v ( Y , Y ) = D ( Y ) 同一元素的协方差等于方差 D \text{由Cov}(X, Y) = \frac{\sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})}{n-1}和s^2 = \frac{\sum_{i=1}^{n} (X_i - \bar{X})^2}{n-1} 可看出:\\ Cov(X,X)=D(X),Cov(Y,Y)=D(Y)\\ 同一元素的协方差等于方差D Cov(X,Y)=n1i=1n(XiXˉ)(YiYˉ)s2=n1i=1n(XiXˉ)2可看出:Cov(X,X)=D(X),Cov(Y,Y)=D(Y)同一元素的协方差等于方差D

协方差衡量了两属性之间的关系:

当 Cov(X,Y)>0 时,表示 X 与 Y 正相关。

当 Cov(X,Y)<0 时,表示 X 与 Y 负相关。

当 Cov(X,Y)=0 时,表示 X 与 Y 不相关。

4、协方差矩阵

定义
C = ( c i j ) n × n = [ c 11 c 12 … c 1 n c 21 c 22 … c 2 n ⋮ ⋮ ⋱ ⋮ c n 1 c n 2 … c n n ] c i j = C o v ( X i , X j ) , i , j = 1 , 2 , . . . , n C = (c_{ij})_{n \times n} = \begin{bmatrix} c_{11} & c_{12} & \ldots & c_{1n} \\ c_{21} & c_{22} & \ldots & c_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ c_{n1} & c_{n2} & \ldots & c_{nn} \end{bmatrix}\\ c_{ij}=Cov(X_i,X_j),i,j=1,2,...,n C=(cij)n×n= c11c21cn1c12c22cn2c1nc2ncnn cij=Cov(Xi,Xj),i,j=1,2,...,n
比如,三维(x,y,z)的协方差矩阵:
C = [ Cov ( x , x ) Cov ( x , y ) Cov ( x , z ) Cov ( y , x ) Cov ( y , y ) Cov ( y , z ) Cov ( z , x ) Cov ( z , y ) Cov ( z , z ) ] C = \begin{bmatrix} \text{Cov}(x, x) & \text{Cov}(x, y) & \text{Cov}(x, z) \\ \text{Cov}(y, x) & \text{Cov}(y, y) & \text{Cov}(y, z) \\ \text{Cov}(z, x) & \text{Cov}(z, y) & \text{Cov}(z, z) \end{bmatrix} C= Cov(x,x)Cov(y,x)Cov(z,x)Cov(x,y)Cov(y,y)Cov(z,y)Cov(x,z)Cov(y,z)Cov(z,z)
特点

  • 协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。
  • 样本矩阵的每行是一个样本,每列为一个维度,所以我们要按列计算均值。
  • 协方差矩阵的对角线就是各个维度上的方差。

特别的,如果做了中心化,则协方差矩阵为(中心化矩阵的协方差矩阵公式,m为样本个数):
D = 1 m Z T Z D=\frac{1}{m}Z^TZ D=m1ZTZ

5、对协方差矩阵求特征值、特征矩阵

A 为 n 阶矩阵,若数 λ 和 n 维非 0 列向量 x 满足 Ax=λx,那么数 λ 称为 A 的特征值,x 称为 A 的对应于特征值 λ 的特征向量。

式 Ax=λx 也可写成 ( A-λE)x=0,E 是单位矩阵,并且|A-λE|叫做 A 的特征多项式。当特征多项式等于 0 的时候,称为 A 的特征方程,特征方程是一个齐次线性方程组,求解特征值的过程其实就是求解特征方程的解。

对于协方差矩阵 A,其特征值( 可能有多个)计算方法为:
∣ A − λ E ∣ = 0 |A-λE|=0 AλE=0

假设 A = [ 3 2 1 4 ] E 为单位矩阵 , E = [ 1 0 0 1 ] 带入公式 ∣ A − λ E ∣ = 0 后, A − λ E = [ 3 − λ 2 1 4 − λ ] 行列式计算: ( 3 − λ ) ( 4 − λ ) − ( 1 ) ( 2 ) = λ 2 − 7 λ + 10 令行列式等于零并解出 λ : λ 2 − 7 λ + 10 = 0 将二次方程进行因式分解: ( λ − 5 ) ( λ − 2 ) = 0 得到两个 λ 的解: λ 1 = 5 , λ 2 = 2 因此,矩阵 A 的特征值为 5 和 2 根据 ( A − λ E ) x = 0 求 x 的值: 对 λ = 5 : ( A − λ E ) x = [ − 2 2 1 − 1 ] x = 0 得到 x 1 = [ 2 − 1 ] 对 λ = 2 : ( A − λ E ) x = [ 1 2 1 2 ] x = 0 得到 x 2 = [ 1 − 1 ] 假设 A = \begin{bmatrix} 3 & 2 \\ 1 & 4 \end{bmatrix}\\ E 为单位矩阵, E = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}\\ 带入公式 |A-λE|=0 后, A - λE = \begin{bmatrix} 3 - λ & 2 \\ 1 & 4 - λ \end{bmatrix}\\ 行列式计算:\\ (3 - λ)(4 - λ) - (1)(2) = λ^2 - 7λ + 10\\ 令行列式等于零并解出 λ:\\ λ^2 - 7λ + 10 = 0\\ 将二次方程进行因式分解:\\ (λ - 5)(λ - 2) = 0\\ 得到两个 λ 的解:\\ λ₁ = 5, λ₂ = 2\\ 因此,矩阵 A 的特征值为 5 和 2\\ 根据 (A-λE)x=0 求 x 的值:\\ 对 λ = 5:\\ (A-λE)x = \begin{bmatrix} -2 & 2 \\ 1 & -1 \end{bmatrix}x = 0\\ 得到 x₁ = \begin{bmatrix} 2 \\ -1 \end{bmatrix}\\ 对 λ = 2:\\ (A-λE)x = \begin{bmatrix} 1 & 2 \\ 1 & 2 \end{bmatrix}x = 0\\ 得到 x₂ = \begin{bmatrix} 1 \\ -1 \end{bmatrix} 假设A=[3124]E为单位矩阵,E=[1001]带入公式AλE=0后,AλE=[3λ124λ]行列式计算:(3λ)(4λ)(1)(2)=λ27λ+10令行列式等于零并解出λλ27λ+10=0将二次方程进行因式分解:(λ5)(λ2)=0得到两个λ的解:λ1=5,λ2=2因此,矩阵A的特征值为52根据(AλE)x=0x的值:λ=5(AλE)x=[2121]x=0得到x1=[21]λ=2(AλE)x=[1122]x=0得到x2=[11]

对数字图像矩阵做特征值分解,其实是在提取这个图像中的特征,这些提取出来的特征是一个个的向量,即对应着特征向量。而这些特征在图像中到底有多重要,这个重要性则通过特征值来表示。

比如一个 100x100 的图像矩阵 A 分解之后,会得到一个 100x100 的特征向量组成的矩阵 Q,以及一个 100x100 的只有对角线上的元素不为 0 的矩阵 E,这个矩阵 E 对角线上的元素就是特征值,而且还是按照从大到小排列的(取模,对于单个数来说,其实就是取绝对值),也就是说这个图像 A 提取出来了 100 个特征,这 100 个特征的重要性由 100 个数字来表示,这 100 个数字存放在对角矩阵 E 中。

所以,特征向量其实反应的是矩阵 A 本身固有的一些特征,本来一个矩阵就是一个线性变换,当把这个矩阵作用于一个向量的时候,通常情况绝大部分向量都会被这个矩阵 A 变换得“面目全非”,但是偏偏刚好存在这么一些向量,被矩阵 A 变换之后居然还能保持原来的样子,于是这些向量就可以作为矩阵的核心代表了。

于是我们可以说:一个变换(即一个矩阵)可以由其特征值和特征向量完全表述,这是因为从数学上看,这个矩阵所有的特征向量组成了这个向量空间的一组基底。而矩阵作为变换的本质其实就是把一个基底下的东西变换到另一个基底表示的空间中。

6、对特征值进行排序

将特征值按照从大到小的排序,选择其中最大的 k 个,然后将其对应的 k 个特征向量分别作为列向量组成特征向量矩阵 Wnxk。

计算 XnewW,即将数据集 Xnew 投影到选取的特征向量上,这样就得到了我们需要的已经降为的数据集 XnewW。

7、评价模型

通过特征值的计算,我们可以得到主成分所占的百分比,用来衡量模型的好坏。

对于前 k 个特征值所保留下的信息量计算方法如下:
η k = ∑ j = 1 k λ j ∑ j = 1 n λ j × 100 % \eta_k =\frac{\sum_{j=1}^{k} \lambda_j}{ \sum_{j=1}^{n} \lambda_j} \times 100\% ηk=j=1nλjj=1kλj×100%

8、代码实现

详细计算过程

import numpy as np  # 导入 NumPy 库,用于数组操作

class CPCA(object):
    '''
    用PCA求样本矩阵X的K阶降维矩阵Z
    Note:请保证输入的样本矩阵X shape=(m, n),m行样例,n个特征
    '''

    def __init__(self, X, K):
        '''
        :param X,训练样本矩阵X
        :param K,X的降维矩阵的阶数,即X要特征降维成k阶
        '''
        self.X = X  # 样本矩阵X
        self.K = K  # K阶降维矩阵的K值
        self.centrX = []  # 矩阵X的中心化
        self.C = []  # 样本集的协方差矩阵C
        self.U = []  # 样本矩阵X的降维转换矩阵
        self.Z = []  # 样本矩阵X的降维矩阵Z

        self.centrX = self._centralized()
        self.C = self._cov()
        self.U = self._U()
        self.Z = self._Z()  # Z=XU求得

    def _centralized(self):
        '''矩阵X的中心化'''
        print('样本矩阵X:\n', self.X)
        centrX = []
        mean = np.array([np.mean(attr) for attr in self.X.T])  # 样本集的特征均值
        print('样本集的特征均值:\n', mean)
        centrX = self.X - mean  # 样本集的中心化
        print('样本矩阵X的中心化centrX:\n', centrX)
        return centrX

    def _cov(self):
        '''求样本矩阵X的协方差矩阵C'''
        # 样本集的样例总数
        ns = np.shape(self.centrX)[0]
        # 样本矩阵的协方差矩阵C
        C = np.dot(self.centrX.T, self.centrX) / (ns - 1)
        print('样本矩阵X的协方差矩阵C:\n', C)
        return C

    def _U(self):
        '''求X的降维转换矩阵U, shape=(n,k), n是X的特征维度总数,k是降维矩阵的特征维度'''
        # 先求X的协方差矩阵C的特征值和特征向量
        a, b = np.linalg.eig(self.C)  # 特征值赋值给a,对应特征向量赋值给b。函数doc:https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.eig.html
        print('样本集的协方差矩阵C的特征值:\n', a)
        print('样本集的协方差矩阵C的特征向量:\n', b)
        # 给出特征值降序的topK的索引序列
        ind = np.argsort(-1 * a)
        # 构建K阶降维的降维转换矩阵U
        UT = [b[:, ind[i]] for i in range(self.K)]
        U = np.transpose(UT)
        print('%d阶降维转换矩阵U:\n' % self.K, U)
        return U

    def _Z(self):
        '''按照Z=XU求降维矩阵Z, shape=(m,k), n是样本总数,k是降维矩阵中特征维度总数'''
        Z = np.dot(self.X, self.U)
        print('X shape:', np.shape(self.X))
        print('U shape:', np.shape(self.U))
        print('Z shape:', np.shape(Z))
        print('样本矩阵X的降维矩阵Z:\n', Z)
        return Z


if __name__ == '__main__':
    '10样本3特征的样本集, 行为样例,列为特征维度'
    X = np.array([[10, 15, 29],
                  [15, 46, 13],
                  [23, 21, 30],
                  [11, 9, 35],
                  [42, 45, 11],
                  [9, 48, 5],
                  [11, 21, 14],
                  [8, 5, 15],
                  [11, 12, 21],
                  [21, 20, 25]])
    K = np.shape(X)[1] - 1
    print('样本集(10行3列,10个样例,每个样例3个特征):\n', X)
    pca = CPCA(X, K)

简化实现

import numpy as np  # 导入 NumPy 库,用于数组操作

class PCA():
    def __init__(self, n_components):
        self.n_components = n_components

    def fit_transform(self, X):
        # 计算特征数量
        self.n_features_ = X.shape[1]
        # 对数据进行零均值化
        X = X - X.mean(axis=0)
        # 计算协方差矩阵
        self.covariance = np.dot(X.T, X) / X.shape[0]
        # 计算协方差矩阵的特征值和特征向量
        eig_vals, eig_vectors = np.linalg.eig(self.covariance)
        # 对特征值进行降序排序,并获取对应的索引
        idx = np.argsort(-eig_vals)
        # 提取前 n_components 个特征向量作为主成分
        self.components_ = eig_vectors[:, idx[:self.n_components]]
        # 将原始数据投影到主成分上
        return np.dot(X, self.components_)


# 创建 PCA 类的实例,设置要保留的主成分数量为 2
pca = PCA(n_components=2)
# 创建一个输入矩阵 X,每一行代表一个样本,每一列代表一个特征
X = np.array([[-1, 2, 66, -1], [-2, 6, 58, -1], [-3, 8, 45, -2], [1, 9, 36, 1], [2, 10, 62, 1], [3, 5, 83, 2]])
# 对输入数据进行主成分分析,并返回降维后的数据
newX = pca.fit_transform(X)
# 打印降维后的数据
print(newX)
# [[  7.96504337  -4.12166867]
#  [ -0.43650137  -2.07052079]
#  [-13.63653266  -1.86686164]
#  [-22.28361821   2.32219188]
#  [  3.47849303   3.95193502]
#  [ 24.91311585   1.78492421]]

9、sklearn 库

在这里插入图片描述

import numpy as np  # 导入 NumPy 库,用于数组操作
# pip install numpy scikit-learn
from sklearn.decomposition import PCA  # 导入 scikit-learn 中的 PCA 模块,scikit-learn 是一个用于机器学习的库

X = np.array([[-1,2,66,-1], [-2,6,58,-1], [-3,8,45,-2], [1,9,36,1], [2,10,62,1], [3,5,83,2]])  # 导入数据,维度为4
pca = PCA(n_components=2)  # 降到2维
pca.fit(X) # 训练
newX=pca.fit_transform(X)  # 降维后的数据
# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)  # 输出贡献率
print(newX)  # 输出降维后的数据

10、鸢尾花实例

通过 Python 的 sklearn 库来实现鸢尾花数据进行降维,数据本身是 4 维的,降维后变成 2 维。

其中样本总数为 150,鸢尾花的类别有三种。

import matplotlib.pyplot as plt  # 导入 Matplotlib 库,用于绘制图表
import sklearn.decomposition as dp  # 导入 scikit-learn 中的 decomposition 模块,用于降维操作
from sklearn.datasets import load_iris  # 导入 scikit-learn 中的 load_iris 函数,用于加载鸢尾花数据集

x,y=load_iris(return_X_y=True)  # 加载数据,x表示数据集中的属性数据,y表示数据标签
pca=dp.PCA(n_components=2)  # 加载pca算法,设置降维后主成分数目为2
reduced_x=pca.fit_transform(x)  # 对原始数据进行降维,保存在reduced_x中
red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
for i in range(len(reduced_x)):  # 按鸢尾花的类别将降维后的数据点保存在不同的表中
    if y[i]==0:
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
    elif y[i]==1:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])
    else:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.show()

在这里插入图片描述

11、优缺点

优点:

1、完全无参数限制的。在 PCA 的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。

2、用 PCA 技术可以对数据进行降维,同时对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。

3、计算方法简单,易于在计算机上实现。

缺点:

如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/407785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL死锁产生的原因和解决方法

一.什么是死锁 要想知道MYSQL死锁产生的原因,就要知道什么是死锁?在了解什么是死锁之前,先来看一个概念:线程安全问题 1.线程安全问题 1.1什么是线程安全问题 线程安全问题&#xff0c;指的是在多线程环境当中&#xff0c;线程并发访问某个资源&#xff0c;从而导致的原子性&a…

编译原理之LR分析

1.LR(0)项目集规范组的构造 构成识别一个文法构造的DFA项目集的全体叫做这个文法的LR&#xff08;0&#xff09;项目集规范族&#xff08;列表法&#xff09; 2.LR(0)项目 如果U :: ub 是文法G的一个规则&#xff0c;其中u或v可为空串&#xff0c;则U—>u.v是G的一个LR(0…

容器镜像详解

1. 镜像组成 一个标准的OCI容器镜像由index, manifest, config, image layers这几个部分组成。 以docker镜像为例&#xff0c;下载的镜像文件保存在/var/lib/docker/目录下面 image/overlay2子目录下面保存着镜像相关的一些元数据 在下面的介绍主要以nginx:latest镜像为例子…

数据结构与算法相关题解20240225

数据结构与算法相关题解20240225 一、58. 最后一个单词的长度二、48. 旋转图像三、69. x 的平方根四、50. Pow(x, n) 一、58. 最后一个单词的长度 简单 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度…

Mysql运维篇(四) MHA

大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#xff09; - 知乎 一、MHA简介&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由日本DeNA公司y…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

MFC由初值终值步长生成数值序列

matlab的冒号运算符可以生成数值序列; 下面来生成自己的数值序列; vc6新建一个对话框工程; 放几个控件;添加成员变量如下; void CMycolonDlg::OnButton1() {// TODO: Add your control notification handler code hereUpdateData(TRUE);double d1, d2;CString str1, …

学习Markdown

https://shadows.brumm.af 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些…

弱引用与C++智能指针

笔试题遇到了弱引用&#xff0c;但是C标准库是没有这个概念的&#xff0c;学了智能指针但是没有听说过弱引用&#xff0c;因此总结一下两者 学习视频链接来自B站 https://www.bilibili.com/video/BV1gV4y1G7fH?p2&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41b智能指针 C的…

C# 中 SQLite 查询数据库表中字段(列)是否存在的方法

查询SQLite数据库表中字段&#xff08;列&#xff09;存在的方法 使用SQL语句为&#xff1a;PRAGMA table_info([DeviceTrees]); 其中“DeviceTrees”为数据库表的名称。 使用SQLite Expert Professional工具&#xff0c;查看该语句是否起作用&#xff0c;这里使用的版本是…

Nest.js权限管理系统开发(三)环境变量与配置文件

一般来说数据库的配置包含了一些敏感信息&#xff0c;不宜写在代码中提交到远程仓库&#xff0c;所以我们可以将配置写在配置文件中,然后提交 git 时候将生产环境的配置文件其忽略。我们可以新建.env和.env.prod两个文件分别存放开发与生产环境配置&#xff0c;也可以使用YAML等…

Linux环境下的性能分析 之 CPU篇(二)

2、CPU的使用情况分析 a、类似任务管理器的top & htop 说到对CPU的性能分析&#xff0c;大家一定不会忘记windows下那个最熟悉的工具&#xff1a;任务管理器。 有了这个玩意儿&#xff0c;我们就可以看到CPU的利用率&#xff0c;以及每一个进程所占用的CPU资源。那在Linu…

【编译原理】第七八章课后习题(王原生第三版)

前言 课本&#xff1a; 编译原理&#xff08;第三版&#xff09;[王生原、董渊…等编著]习题&#xff1a; 主要习题内容是第一章到第八章&#xff0c;具体内容如下表 章节内容链接第一章课后部分选择题https://blog.csdn.net/Zchengjisihan/article/details/136243955第二章课…

瑞_23种设计模式_桥接模式

文章目录 1 桥接模式&#xff08;Bridge Pattern&#xff09;1.1 介绍1.2 概述1.3 桥接模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二2.1 需求2.1 代码实现 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《23种设计模式》的桥接模式篇。本文中的部分图和概念等资料…

[Linux]文件基础-如何管理文件

回顾C语言之 - 文件如何被写入 fopen fwrite fread fclose fseek … 这一系列函数都是C语言中对文件进行的操作&#xff1a; int main() {FILE* fpfopen("text","w");char str[20]"write into text";fputs(str,fp);fclose(fp);return 0; }而上…

Stable Diffusion 3震撼发布模型与Sora同架构

Prompt&#xff1a;Epic anime artwork of a wizard atop a mountain at night casting a cosmic spell into the dark sky that says "Stable Diffusion 3" made out of colorful energy Stability AI发布Stable Diffusion 3文本到图像模型。该模型采用扩散变换架构…

ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

《嵌入式工程师自我修养/C语言》系列——ARM处理器有哪些工作模式和寄存器&#xff1f;各寄存器作用是什么&#xff1f; 一、ARM处理器的工作模式及寄存器1.1 ARM处理器的工作模式1.2 ARM处理器中的寄存器 二、ARM 异常中断处理2.1 什么是异常&#xff1f;异常向量表是什么&…

Python sorted函数

在Python编程中&#xff0c;sorted()函数是一个内置函数&#xff0c;用于对可迭代对象进行排序。这个函数可以应用于列表、元组、字符串等可迭代对象&#xff0c;并返回一个新的已排序的列表。sorted()函数还提供了一系列的参数&#xff0c;可以实现不同类型的排序&#xff0c;…

服务区智慧公厕

在如今追求智能化、便捷化的社会背景下&#xff0c;高速公路服务区智慧公厕正成为人们关注的焦点。作为高速公路上的必要设施&#xff0c;公厕的提升已经不再局限于简单的清洁卫生&#xff0c;而是更多地涉及到智能化、舒适度和用户体验。本文以智慧公厕源头厂家广州中期科技有…

Autoencoder深度学习中的无监督学习神经网络

在当今的深度学习领域中&#xff0c;自动编码器&#xff08;Autoencoder&#xff09;是一种常见的无监督学习神经网络模型&#xff0c;用于学习有效的数据表示。自动编码器在许多领域都有广泛的应用&#xff0c;包括特征提取、降维、图像去噪、生成模型等。 自动编码器的基本原…