人工智能 — 特征选择、特征提取、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阶降维矩阵ZNote:请保证输入的样本矩阵X shape=(m, n),m行样例,n个特征'''def __init__(self, X, K):''':param X,训练样本矩阵X:param K,X的降维矩阵的阶数,即X要特征降维成k阶'''self.X = X  # 样本矩阵Xself.K = K  # K阶降维矩阵的K值self.centrX = []  # 矩阵X的中心化self.C = []  # 样本集的协方差矩阵Cself.U = []  # 样本矩阵X的降维转换矩阵self.Z = []  # 样本矩阵X的降维矩阵Zself.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 centrXdef _cov(self):'''求样本矩阵X的协方差矩阵C'''# 样本集的样例总数ns = np.shape(self.centrX)[0]# 样本矩阵的协方差矩阵CC = np.dot(self.centrX.T, self.centrX) / (ns - 1)print('样本矩阵X的协方差矩阵C:\n', C)return Cdef _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.htmlprint('样本集的协方差矩阵C的特征值:\n', a)print('样本集的协方差矩阵C的特征向量:\n', b)# 给出特征值降序的topK的索引序列ind = np.argsort(-1 * a)# 构建K阶降维的降维转换矩阵UUT = [b[:, ind[i]] for i in range(self.K)]U = np.transpose(UT)print('%d阶降维转换矩阵U:\n' % self.K, U)return Udef _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 Zif __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] - 1print('样本集(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_componentsdef 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、计算方法简单,易于在计算机上实现。

缺点:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法(Java版)】深度剖析二分查找算法

【二分查找算法】的时间复杂度为O(log n)&#xff0c;其中n为数组的长度。因为每次查找都将查找范围缩小一半&#xff0c;所以算法的时间复杂度是对数级别的。 目录 前言 二分查找算法是什么&#xff1f; 算法实现 方式一&#xff1a;&#xff08;左闭右闭&#xff09; 文…

电机控制常见的外围器件

小型断路器&#xff1a; 这些通通都叫小型断路器&#xff0c;二十年的老电工不一定都认识&#xff0c;不信看看_哔哩哔哩_bilibili 1PIN 2PIN 3PIN 4PIN: 正常情况下火线和零线的电流是相等的&#xff0c;但是漏电的情况下&#xff0c;两线的电流差值大于30毫安&#xff0c;漏…

合纵连横 – 以 Flink 和 Amazon MSK 构建 Amazon DocumentDB 之间的实时数据同步

在大数据时代&#xff0c;实时数据同步已经有很多地方应用&#xff0c;包括从在线数据库构建实时数据仓库&#xff0c;跨区域数据复制。行业落地场景众多&#xff0c;例如&#xff0c;电商 GMV 数据实时统计&#xff0c;用户行为分析&#xff0c;广告投放效果实时追踪&#xff…

笔记本hp6930p安装Android-x86避坑日记

一、序言 农历癸卯年前大扫除&#xff0c;翻出老机hp6930p&#xff0c;闲来无事&#xff0c;便安装Android-x86玩玩&#xff0c;期间多次入坑&#xff0c;随手记之以避坑。 笔记本配置&#xff1a;T9600,4G内存&#xff0c;120G固态160G机械硬盘 二、Android-x86系统简介 官…

2023最新盲盒交友脱单系统源码

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 或 源码软件库 最新盲盒交友脱单系统源码&#xff0c;纸条广场&#xff0c;单独抽取/连抽/同城抽取/高质量盒子 新增功能包括心动推荐&#xff…

js使用new Image()创建img对象不生效

我在做vue项目的时候&#xff0c;想获取到图片的宽高&#xff0c;然后把宽高发给后端&#xff0c;代码类似是这样的 function getFileData(file: File) {return new Promise(function (resolve, reject) {let reader new FileReader();reader.readAsDataURL(file);reader.onlo…

备考2024年高考全国甲卷文科数学:历年选择题真题练一练

距离2024年高考还有三个多月的时间&#xff0c;最后这个时间&#xff0c;同学们基本上是以刷题为主。刷题的时候最重要的是把往年的真题吃透&#xff0c;因为真题是严格按照考纲出的&#xff0c;掌握了真题后面的知识点&#xff0c;并能举一反三地运用&#xff0c;那么高考的高…

用Python Matplotlib画图导致paper中含有Type-3字体,如何解决?

用Python Matplotlib画图导致paper中含有Type-3字体&#xff0c;如何解决&#xff1f; 在提交ACM或者IEEE论文之前&#xff0c;都会有格式的检查&#xff0c;格式的其中一个要求是paper中不能含有Type-3的字体。因为Type-1和True Type字体都是矢量字体&#xff0c;而Type-3并不…

华为OD机试 - 数字排列(Java JS Python C C++)

题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1 ~ 9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 N 位置的数字,其中 N 为给出数字中最大的(如果不到这么多数字则给出最后一个即可)。 注意: 2 可以当作 5 来使用…

老杨说运维 | 运维大数据价值探索

文末附有视频 伴随第六届双态IT乌镇用户大会的圆满完成&#xff0c;擎创科技“一体化数智管理和大模型应用”主题研讨会也正式落下了帷幕。 云原生转型正成为很多行业未来发展战略&#xff0c;伴随国家对信创数字化要求的深入推进&#xff0c;面对敏稳共存这一近年出现的新难…

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

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

RocketMQ快速实战以及集群架构原理详解

RocketMQ快速实战以及集群架构原理详解 组成部分 启动Rocket服务之前要先启动NameServer NameServer 提供轻量级Broker路由服务&#xff0c;主要是提供服务注册 Broker 实际处理消息存储、转发等服务的核心组件 Producer 消息生产者集群&#xff0c;通常为业务系统中的一个功…

板块二 JSP和JSTL:第四节 EL表达式 来自【汤米尼克的JAVAEE全套教程专栏】

板块二 JSP和JSTL&#xff1a;第四节 EL表达式 一、什么是表达式语言二、表达式取值&#xff08;1&#xff09;访问JSP四大作用域&#xff08;2&#xff09;访问List和Map&#xff08;3&#xff09;访问JavaBean 三、 EL的各种运算符&#xff08;1&#xff09;.和[ ]运算符&…

《The Art of InnoDB》第二部分|第4章:深入结构-磁盘结构-redo log

4.3 redo log 目录 4.3 redo log 4.3.1 redo log 介绍 4.3.2 redo log 的作用 4.3.3 redo log file 结构 4.3.4 redo log 提交逻辑 4.3.5 redo log 持久化逻辑 4.3.6 redo log 检查点 4.3.7 小结

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

抖音数据抓取工具|短视频下载工具|视频内容提取软件

一、开发背景&#xff1a; 随着抖音平台的流行&#xff0c;越来越多的人希望能够下载抖音视频以进行个人收藏或分享。然而&#xff0c;目前在网上找到的抖音视频下载工具功能单一&#xff0c;操作繁琐&#xff0c;无法满足用户的需求。因此&#xff0c;我们决定开发一款功能强大…

java面试题之mysql篇

1、数据库索引 ​​​​​​​ 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她&#xff0c;则与在表中搜索所有的行相比&#xff0c;索引有助于更快地获取信息。 索引的一个主要…

编程笔记 Golang基础 030 接口

编程笔记 Golang基础 030 接口 一、接口的定义&#xff1a;二、接口的实现&#xff1a;三、接收者类型四、应用示例五、接口的意义 在Go语言中&#xff0c;接口是一种类型定义&#xff0c;它描述了一组方法签名&#xff0c;任何实现了这些方法的类型都隐式地实现了这个接口。这…

k8s-创建命名空间的方法

使用命令式创建namespace kubectl create namespace test-namespace查看命名空间 kubectl get namespace使用声明式创建命名空间 a. 编写dev-namespace.yaml文件 apiVersion: v1 kind: Namespace metadata:name: dev-namespaceb. 使用dev-namespace.yaml&#xff0c;yaml文件创…

音视频开发之旅(69)-SD图生图

目录 1. 效果展示 2. ControlNet介绍 3. 图生图流程浅析 4. SDWebui图生图代码流程 5. 参考资料 一、效果展示 图生图的应用场景非常多&#xff0c;比较典型的应用场景有风格转化&#xff08;真人与二次元&#xff09;、线稿上色、换装和对图片进行扩图等&#xff0c;下面…