光谱数据处理:1.特征波长优选的不同方法与Python实现

        首先,我们要理解为什么要对“光谱数据进行特征波长优选”以及这是在干嘛,光谱数据可以想象成一长串的彩色条纹,每种颜色对应一个波长,就像彩虹一样。这些颜色的条纹代表了从某种物质(比如植物、矿石或是食品)反射或透过光的特性。通过分析这些条纹,我们可以了解物质的很多信息,比如它是什么成分、有没有污染、熟度等等。

        但问题在于这长串的条纹实在太长了,里面有很多颜色,有的重要有的不重要。如果把每种颜色都当成一个线索来追,工作量会非常巨大,而且有很多无用功。所以我们需要找出那些最关键的颜色(也就是波长),这样我们就可以只关注这些颜色,提高我们的寻宝效率。

        特征波长优选,就是通过一系列数学方法和技巧,来确定哪些颜色的条纹(波长)最能帮助我们了解我们想要知道的信息。确定了这些关键的颜色条纹之后,我们在分析物质时就可以只看这些颜色,这样既省时又准确。

一、主成分分析法(Principal Component Analysis,PCA)

(1)原理详解

        假想你正在用一台相机从不同角度拍摄一座山。每张照片都提供了山的视角,但所有的照片都有重复的信息(都是同一座山),同时每个角度也显示了一些独特的细节。PCA的目标就是找出最好的几个角度,以最简洁的方式展现出山的最关键特征。

在数学上,PCA是这样实现的:

  1. 数据中心化: 首先,要将每个特征(如,每张照片的视角)调整为以零为中心,也就是说,我们需要从每个特征中减去它的平均值。这样做的目的是让PCA后续的计算更加方便,同时去除数据位置的影响,只保留数据形状的信息。

  2. 计算协方差矩阵: 接下来,我们计算数据的协方差矩阵。在我们的比喻中,协方差矩阵描述了不同角度之间如何变化,或者说这些角度是否会同时增加或减少。如果两个角度通常同时增减,它们就具有高协方差,意味着这两个角度信息重合得很多。

  3. 找出主成分: 现在,我们要找出主成分,也就是找到那些能够捕捉最多山的特征的“最好的角度”。数学上,这意味着我们要找到协方差矩阵的特征向量,并将它们按照对应特征值的大小排序。特征值越大,对应的特征向量就能捕捉越多的信息(变异性)。

  4. 降维: 最后,我们选择前几个最大的特征值和对应的特征向量。这些特征向量称为“主成分”,它们定义了新的坐标系,这个坐标系的坐标轴指向数据变化最大的方向。通过将原始数据投影到这些主成分上,我们可以用更少的维度来描述数据,同时保留最重要的信息。

        简而言之,PCA就像是找到了描述山的几张最有代表性的照片。每张照片(主成分)都尽可能多地包含了山的信息,且每张照片都提供了之前照片中没有的信息。通过这几张照片,我们可以用最少的数据捕捉到最关键的特征。

1)生成模拟光谱数据
def generate_spectral_data(samples, features):np.random.seed(0)return np.random.rand(samples, features)
  • generate_spectral_data 函数使用np.random.rand创建一个给定形状(samples行,features列)的数组,数组中的每个元素都是在[0,1)区间内均匀分布的随机浮点数。
  • 设置随机种子(np.random.seed(0))保证每次运行代码时生成的随机数是相同的,这有助于结果的可重复性。
2)PCA算法实现
def apply_pca(data, n_components):pca = PCA(n_components=n_components)principal_components = pca.fit_transform(data)return principal_components, pca.explained_variance_ratio_
  • apply_pca 函数利用scikit-learn中的PCA类来对输入数据data执行主成分分析。
  • n_components参数指定了PCA降维后保留的主成分数目。
  • fit_transform方法计算PCA并将数据转化为主成分空间,返回转换后的数据。
  • explained_variance_ratio_属性表示每个主成分解释的方差比例。

(2)完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 生成模拟光谱数据
def generate_spectral_data(samples, features):np.random.seed(0)return np.random.rand(samples, features)# 使用PCA进行特征提取
def apply_pca(data, n_components):pca = PCA(n_components=n_components)principal_components = pca.fit_transform(data)return principal_components, pca.explained_variance_ratio_# 主函数
def main():# 模拟生成光谱数据,设定样本数和特征数samples = 100  # 样本数features = 200  # 特征数,即波长数spectral_data = generate_spectral_data(samples, features)# 应用PCA提取特征principal_components, explained_variance_ratio = apply_pca(spectral_data, n_components=2)# 绘制模拟光谱数据的前两个主成分plt.figure(figsize=(15, 5))plt.subplot(1, 2, 1)plt.scatter(principal_components[:, 0], principal_components[:, 1])plt.title("PCA - First two principal components")# 绘制解释方差比例plt.subplot(1, 2, 2)plt.bar(range(len(explained_variance_ratio)), explained_variance_ratio)plt.title("PCA - Explained variance ratio")plt.tight_layout()plt.show()if __name__ == "__main__":main()

(3)运行结果

二、协同区间偏最小二乘法(SiPLS

(1)原理详解

        假设你是一名音乐制作人,你有一段复杂的音轨,里面包含了各种乐器的音频信号。你的目标是找出音轨中那些对整体音乐风格贡献最大的乐器组合。你不可能一次性听清每个乐器的影响,因此你需要一种方法来区分和评估每种乐器的重要性。

SiPLS的做法类似于这样一个过程:

  1. 划分区间: 就像你可能会把音轨分成多个部分来单独分析每个乐器一样,SiPLS首先将整个数据集(例如光谱数据)分成多个小的区间。这样做的目的是因为不同区间的数据(或者音乐中的乐器组合)可能会有不同的重要性。

  2. 区间选择: 接着,对于每个区间,SiPLS评估它们对于输出结果(可能是化学成分的浓度或者音乐风格的贡献)的影响。这个步骤类似于你听每个乐器段落并判断它对整体作品的贡献大小。

  3. 组合和构建模型: 根据这些区间的贡献,SiPLS会选择那些贡献最大的区间并将它们组合起来。这就像是你选取那些最能代表音乐风格的乐器组合,并将它们混合以形成一个完整的音轨。

  4. 优化和评估: 最后,SiPLS通过对这些选定区间的数据进行偏最小二乘回归分析来构建一个预测模型。在音乐制作中,你会尝试调整不同乐器的音量和效果来使整体作品听起来最好。同样,SiPLS调整模型参数来确保预测结果与实际结果尽可能接近。

总的来说,SiPLS的目的是在大量复杂数据中找到最有信息量的部分,然后只用这些部分来构建一个有效的模型。在光谱分析中,这意味着可以更准确地预测样本的性质,同时减少了计算量和噪声的影响。

1)生成模拟光谱数据
def generate_spectral_data(samples, features, noise_level=0.1):np.random.seed(0)# 生成波长wavelengths = np.linspace(400, 2500, features)# 生成光谱数据,基于某些波长的线性组合加噪声X = np.random.randn(samples, features) + np.sin(wavelengths) * 10# 生成响应变量,同样是波长的线性组合加噪声Y = np.dot(X, np.sin(wavelengths)) * 0.5 + np.random.randn(samples) * noise_levelreturn X, Y, wavelengths
  • samples:数据集中的样本数量。
  • features:每个样本的特征数量,也可以看作是波长数。
  • noise_level:添加到数据中的噪声水平,用于更接近真实世界的情况。
  • X:模拟光谱数据矩阵。
  • Y:目标变量,通常是样本的某些特性,它与光谱数据有关联。
  • wavelengths:对应于光谱数据特征的波长值。
2)SiPLS算法实现
def SiPLS(X, Y, wavelengths, interval_length=10):n_intervals = X.shape[1] // interval_lengthscores = []for i in range(n_intervals):start = i * interval_lengthend = start + interval_lengthpls = PLSRegression(n_components=2)score = -np.mean(cross_val_score(pls, X[:, start:end], Y, cv=5, scoring='neg_mean_squared_error'))scores.append(score)# 返回每个区间的性能评分return np.array(scores), wavelengths[:n_intervals*interval_length:interval_length]
  • interval_length:决定了划分子区间的长度。
  • n_intervals:根据给定的光谱特征数和区间长度计算总共可以划分的区间数。
  • scores:记录每个区间PLS模型的均方误差(MSE)分数列表。
  • 循环遍历每个区间,对每个子区间执行PLS回归,并通过交叉验证计算MSE分数。
  • 返回每个区间的MSE分数和对应的波长值。

(2)完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cross_decomposition import PLSRegression
from sklearn.model_selection import cross_val_score# 生成模拟光谱数据
def generate_spectral_data(samples, features, noise_level=0.1):np.random.seed(0)# 生成波长wavelengths = np.linspace(400, 2500, features)# 生成光谱数据,基于某些波长的线性组合加噪声X = np.random.randn(samples, features) + np.sin(wavelengths) * 10# 生成响应变量,同样是波长的线性组合加噪声Y = np.dot(X, np.sin(wavelengths)) * 0.5 + np.random.randn(samples) * noise_levelreturn X, Y, wavelengths# SiPLS算法
def SiPLS(X, Y, wavelengths, interval_length=10):n_intervals = X.shape[1] // interval_lengthscores = []for i in range(n_intervals):start = i * interval_lengthend = start + interval_lengthpls = PLSRegression(n_components=2)score = -np.mean(cross_val_score(pls, X[:, start:end], Y, cv=5, scoring='neg_mean_squared_error'))scores.append(score)# 返回每个区间的性能评分return np.array(scores), wavelengths[:n_intervals*interval_length:interval_length]# 主函数
def main():samples = 100features = 200X, Y, wavelengths = generate_spectral_data(samples, features)# 应用SiPLSscores, selected_wavelengths = SiPLS(X, Y, wavelengths)# 绘图展示原始数据plt.figure(figsize=(15, 6))plt.subplot(2, 1, 1)plt.plot(wavelengths, X.T, color='grey', alpha=0.5)plt.title("Simulated Spectral Data")# 绘图展示SiPLS区间评分plt.subplot(2, 1, 2)plt.plot(selected_wavelengths, scores, marker='o')plt.xlabel('Wavelength (nm)')plt.ylabel('MSE Score')plt.title('SiPLS Interval Scores')plt.tight_layout()plt.show()if __name__ == "__main__":main()

(3)运行结果

        由图可通过对比不同子区间的MSE分数,来选择最佳特征波长进行后续分析。

三、连续投影算法(Successive Projections Algorithm,SPA

(1)原理详解

        想象一下,你有一个乐队,每个乐器都发出不同的声音。如果要为一首曲子选择最合适的乐器组合,你会尝试找出哪些乐器最能代表歌曲的核心旋律和节奏,同时确保它们听起来不会混在一起,即每个乐器的声音都是清晰和独特的。

SPA的工作原理即为以下几个步骤:

  1. 开始时,所有乐器都可选择: SPA开始时,所有的变量(在光谱数据中即为所有波长)都是可选择的。在乐队的比喻中,这就像是所有乐器都准备好了,等待被选中加入曲目。

  2. 选择第一个乐器: 首先,SPA会从所有乐器中选择一个最能代表曲目的乐器。在数学上,这相当于从所有变量中选择一个与响应变量(可能是化学成分的浓度)关联最紧密的变量。

  3. 寻找与已选乐器不同的乐器: 接下来,SPA会在剩下的乐器中寻找一个与已选乐器尽可能不同的乐器。数学上,这意味着寻找一个与已选变量正交(或者说相关性最小)的变量。这样可以确保新选择的变量能提供一些新信息,而不是重复之前已选择的变量的信息。

  4. 迭代选择: SPA会重复上述过程,每次都选出一个与当前已选集合正交的新变量。这就像是一个个挑选乐器,确保每个新增的乐器都能带来不同的音色,从而丰富整首歌曲。

  5. 终止条件: 这个过程会一直进行,直到达到预先设定的乐器数量(或者在光谱数据分析中的变量数量)或者进一步添加乐器(变量)不再使得曲目(模型)有显著提升。

        通过SPA,你最终会得到一个由互相独立的乐器(变量)组成的乐队(数据子集),它们合在一起能够很好地演奏出一首曲子(构建一个有效的预测模型)而不会有太多的噪音(不必要的信息或多余的变量)干扰听众(模型的性能)。

        所以,SPA帮助你从大量的可能选项中挑选出最有代表性且互不干扰的一小部分,用以构建一个既简洁又有效的模型。

SPA算法的实现
def successive_projections_algorithm(X, num_variables):num_samples, num_features = X.shapeselected_variables = []P = np.eye(num_samples)for i in range(num_variables):var_projections = np.dot(X.T, P).Tvar_norms = np.sum(var_projections**2, axis=0)next_var = np.argmax(var_norms)selected_variables.append(next_var)xi = X[:, [next_var]]P = P - np.dot(np.dot(P, xi), np.dot(xi.T, P)) / np.dot(np.dot(xi.T, P), xi)return selected_variables
  • 函数successive_projections_algorithm(X, num_variables)接受输入数据X(假设为光谱数据)和一个整数num_variables,表示要选择的变量数量。
  • 算法初始化一个单位矩阵P作为投影矩阵。
  • 在每次迭代中:
    • 计算当前残差矩阵XP的乘积,得到各变量的投影。
    • 计算每个变量投影的范数(即投影向量的平方和),选择范数最大的变量,因为它包含最多的残差信息。
    • 更新所选变量的索引列表selected_variables
    • 使用更新后的投影矩阵P计算新的残差矩阵。
    • 最后返回选择的变量索引列表。

(2)完整代码

import numpy as np
import matplotlib.pyplot as pltdef successive_projections_algorithm(X, num_variables):num_samples, num_features = X.shapeselected_variables = []P = np.eye(num_samples)for i in range(num_variables):var_projections = np.dot(X.T, P).Tvar_norms = np.sum(var_projections**2, axis=0)next_var = np.argmax(var_norms)selected_variables.append(next_var)xi = X[:, [next_var]]P = P - np.dot(np.dot(P, xi), np.dot(xi.T, P)) / np.dot(np.dot(xi.T, P), xi)return selected_variables# 模拟一些数据作为示例
np.random.seed(0)
num_samples = 200
num_features = 100
X = np.random.rand(num_samples, num_features)  # 模拟的光谱数据# 使用SPA选择特征
num_selected_variables = 10  # 你希望选择的特征数量
selected_wavelengths = successive_projections_algorithm(X, num_selected_variables)# 绘图以显示原始光谱数据和选定的特征波长
average_spectrum = np.mean(X, axis=0)
wavelengths = np.arange(num_features)  # 假设波长是连续的整数值plt.figure(figsize=(12, 6))
plt.plot(wavelengths, average_spectrum, label='Average Spectrum')
plt.scatter(wavelengths[selected_wavelengths], average_spectrum[selected_wavelengths], color='red', label='Selected Wavelengths')
plt.xlabel('Wavelength')
plt.ylabel('Intensity')
plt.title('Spectral Data with Selected Features by SPA')
plt.legend()
plt.show()

(3)运行结果

四、竞争自适应重采样算法(Competive Adaptive Reweighted Sampling ,CARS

(1)原理详解

        想象一下,你是一个厨师,面前放着各种各样的食材。你的任务是从中选择出最合适的几种来制作一道美味的菜肴。但是,有一个挑战:你的菜板空间有限,不能同时准备太多的食材。

        这里是你的策略:

  1. 先试一小部分:你首先随机挑一小撮食材做个样品菜,看看效果怎样。

  2. 评估每种食材:根据样品菜的口感,你评估每种食材的贡献大小,哪些食材让菜更美味,哪些没有太大帮助。

  3. 淘汰一些食材:你决定淘汰掉那些看起来不怎么影响味道的食材,因为你的空间有限,需要给更有潜力的食材留下位置。

  4. 调整食材比重:根据你对每种食材的评估,你决定调整它们在菜中的比重,比如增加某些食材的用量,减少或淘汰另一些。

  5. 重复过程:你不断重复这一过程,每次用不同的食材组合做样品菜,评估,淘汰,直到找到那个完美的配方,即最能提升你菜品口味的食材组合。

  6. 最终结果:最后,你得到了一个既不过多也不过少,每种食材都能发挥其最佳效果的食材组合,这就是你的拿手好菜。

        将这个比喻转换为 CARS 算法的话,这些食材就像是你要分析的数据中的特征(如光谱数据中的波长),而美味的菜肴就像是一个强大的预测模型,你希望只用最有信息量的特征来做出预测。CARS 通过一个迭代的过程,不断地选择和调整特征,以确保最终模型的精确度和可解释性。就像厨师通过尝试和调整来找到最好的食材组合一样。

利用 SelectKBest 进行特征选择
selector = SelectKBest(score_func=f_regression, k=10)
X_selected = selector.fit_transform(X, y)

创建一个SelectKBest对象,用于特征选择。score_func参数设置为f_regression,这意味着选择特征的依据是每个特征对目标变量的 F-统计量。参数k=10指定我们希望选择的特征数量。

fit_transform方法将选择操作应用于数据X和目标y,结果是筛选后的数据X_selected,它只包含了我们希望保留的那些最佳特征。

(2)完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import SelectKBest, f_regression# 假设 X 是模拟的光谱数据,y 是相应模拟的目标变量
np.random.seed(0)
X = np.random.rand(100, 200)  # 100个样本,200个波长点
y = np.random.rand(100)       # 100个样本的目标值# 使用 SelectKBest 进行特征选择,这里使用的是 f_regression 方法
# f_regression 是用于回归任务的特征选择函数,它不是CARS算法
selector = SelectKBest(score_func=f_regression, k=10)
X_selected = selector.fit_transform(X, y)# 绘制原始数据和经过特征选择后的数据
plt.figure(figsize=(14, 6))# 绘制原始数据
plt.subplot(1, 2, 1)
plt.imshow(X.T, aspect='auto')
plt.colorbar()
plt.title('Original Spectra Data')# 绘制特征选择后的数据
plt.subplot(1, 2, 2)
selected_features = selector.get_support(indices=True)
selected_spectra = X[:, selected_features]
plt.imshow(selected_spectra.T, aspect='auto')
plt.colorbar()
plt.title('Selected Features')plt.show()

(3)运行结果

五、随机蛙跳算法(Random-Frog

(1)原理详解

        想象你在一个巨大的草地上寻找宝藏,草地上有很多可能藏有宝藏的地点,但你没有地图,所以不知道宝藏确切在哪儿。

        这就是随机蛙跳算法的情况,其中宝藏相当于对我们很重要的信息或特征(就像在光谱数据中找到最重要的波长点),而草地的每个地点代表数据集中的一个特征。

        现在,随机蛙跳算法的过程大概是这样的:

  1. 随机选择:你闭上眼睛,随机地跳到草地上的某个点,就好像是“蛙跳”一样。

  2. 挖掘尝试:在这个点上,你用铲子挖挖看,看能不能找到宝藏。

  3. 记录结果:如果你觉得这个点下面可能有宝藏,你就在地图上做个标记,这样你就知道这个地方值得以后再来挖掘。

  4. 重复过程:你重复闭眼随机跳跃和挖掘的过程很多次。

  5. 分析结果:最后,你打开眼睛,看看哪些地方被标记了很多次。这些地方很可能就是藏宝的热点,因为你多次随机挖掘都觉得那里可能有宝藏。

  6. 做出判断:最后,你决定专注于那些被反复标记的地点进行深入挖掘,因为这样做找到宝藏的可能性最大。

        用这个比喻来理解,随机蛙跳算法通过反复随机选择一些特征,并评估它们对结果的影响(有没有“挖到宝藏”),然后总结哪些特征最有可能是我们寻找的“宝藏”。这种方法不需要预先知道哪里有宝藏,而是通过重复随机尝试和评估来找到最好的线索。

def random_frog(X, y, num_selected_features, num_iterations=100):# 保存特征的重要性分数feature_importances = np.zeros(X.shape[1])# 随机蛙跳迭代过程for _ in range(num_iterations):# 选择一个随机特征子集selected_features = np.random.choice(X.shape[1], num_selected_features, replace=False)# 创建一个随机森林分类器model = RandomForestClassifier(n_estimators=10, random_state=0)# 使用选定的特征和随机森林进行训练model.fit(X[:, selected_features], y)# 更新特征的重要性分数feature_importances[selected_features] += model.feature_importances_# 根据重要性分数选择最重要的特征important_features = np.argsort(feature_importances)[-num_selected_features:]return important_features

        该函数使用了一个简化的随机蛙跳过程来选择特征。在这个过程中,我们在每个迭代步骤中随机选择一个特征子集,并用随机森林算法训练一个模型,然后基于模型输出的特征重要性分数来更新这些特征的总重要性评分。在多次迭代之后,我们选择那些具有最高累积重要性分数的特征。

(2)完整代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier# 假设光谱数据集 X 和对应的类别标签 y
# 生成一些示例数据作为光谱数据
np.random.seed(0)
X = np.random.rand(100, 200)  # 100个样本,200个波长特征
y = np.random.randint(0, 2, 100)  # 100个样本的类别标签(0或1)# 定义一个简化的 Random Frog 方法
def random_frog(X, y, num_selected_features, num_iterations=100):# 保存特征的重要性分数feature_importances = np.zeros(X.shape[1])# 随机蛙跳迭代过程for _ in range(num_iterations):# 选择一个随机特征子集selected_features = np.random.choice(X.shape[1], num_selected_features, replace=False)# 创建一个随机森林分类器model = RandomForestClassifier(n_estimators=10, random_state=0)# 使用选定的特征和随机森林进行训练model.fit(X[:, selected_features], y)# 更新特征的重要性分数feature_importances[selected_features] += model.feature_importances_# 根据重要性分数选择最重要的特征important_features = np.argsort(feature_importances)[-num_selected_features:]return important_features# 使用随机蛙跳方法选择特征
selected_features = random_frog(X, y, num_selected_features=20)# 绘制原始数据
plt.figure(figsize=(15, 5))
plt.subplot(1, 2, 1)
plt.imshow(X.T, aspect='auto', cmap='viridis')
plt.colorbar()
plt.title('Original Spectral Data')# 绘制经过特征选择后的数据
plt.subplot(1, 2, 2)
selected_data = X[:, selected_features]
plt.imshow(selected_data.T, aspect='auto', cmap='viridis')
plt.colorbar()
plt.title('Selected Features')plt.tight_layout()
plt.show()

(3)运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

leet hot 100-1 两数之和

两数之和 原题链接思路代码 原题链接 leet hot 100-1 1. 两数之和 思路 可以把当前数字放到容器里面去 当我们遍历一个新的数字的时候 减一下与目标值的差 然后得到的结果在容器里面查看是否存在 时间复杂度O(n) 空间复杂度(n) 代码 class Solution { public:vector<…

!!!Python虚拟环境改名后的坑!!!!

搞了一晚上终于弄好这python虚拟环境的问题了&#xff01;真的是坑啊&#xff01; 本来用的纯python环境下的虚拟环境&#xff0c;一时心血来潮&#xff0c;把电脑重新装了一遍&#xff0c;虚拟环境的目录也改了一下&#xff0c;结果虚拟环境再vscode中是可以使用&#xff0c;…

Uniapp小程序开发-底部tabbar的开发思路

文章目录 前言一、uniapp 实现 tabbar二、图标使用网络图片后端返回tabbar信息uniapp方式中的setTabBarItem 总结 前言 记录uniapp 开发小程序的底部tabbar &#xff0c;这里讨论的不是自定义tabbar的情况。而是使用wx.setTabBarItem(Object object) 这个api的情况。关于custo…

通天星CMSV6 车载视频监控平台信息泄露漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

uni-app vue3 setup nvue中webview层级覆盖问题

核心就是这两行&#xff0c;&#x1f923;发现设置后不能点击了&#xff0c;这个玩意可能只能弹窗打开的时候动态的修改 position: static, zindex: 0onLoad(options > {loadWebview()})function loadWebview() {let pageInfo uni.getSystemInfoSync();width.value pageI…

抽象的java

Consider defining a bean of type org.springframework.mail.MailSender in your configuration. 报错原因&#xff1a; 第一个&#xff1a;未安装对应的依赖 第二个&#xff1a;对应配置问题 背景&#xff1a;用springboot-java完成邮箱发送 第一个问题解决方法&#xff1…

太阳能光伏电池模型参数辨识模型介绍

一、太阳能光伏电池模型参数辨识模型介绍 由于传统化石能源短缺问题日益严重&#xff0c;我国对新能源发展的重视提到了前所未有的高度。太阳能作为一种可再生能源&#xff0c;不会对环境造成污染&#xff0c;受到了越来越多的关注太阳能由于其储量丰富,无污染和无地域限制等优…

【Python笔记-设计模式】前端控制器模式

一、说明 常作为MVC&#xff08;Model-View-Controller&#xff09;模式的一部分&#xff0c;用来处理用户请求并将其分发给相应的处理程序&#xff08;即路由匹配&#xff09;。 (一) 解决问题 将请求的处理流程集中管理&#xff0c;统一处理所有的请求 (二) 使用场景 需…

车载电子电器架构 —— 电气架构开发计划

车载电子电器架构 —— 电气架构开发计划 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

《隐私计算简易速速上手小册》第8章:隐私计算对机器学习和 AI 的影响(2024 最新版)

文章目录 8.1 机器学习中的隐私问题8.1.1 基础知识8.1.2 主要案例:使用差分隐私的机器学习8.1.3 拓展案例 1:基于隐私的数据聚合8.1.4 拓展案例 2:保护隐私的推荐系统8.2 使用隐私计算加强 AI 安全8.2.1 基础知识8.2.2 主要案例:使用同态加密的数据分析8.2.3 拓展案例 1:安…

wpf 3d 后台加载模型和调整参数

下载了一个代码&#xff0c;加载obj模型&#xff1b;它的参数在xaml里&#xff0c;模型加载出来刚好&#xff1b; 然后加载另一个obj模型&#xff1b;加载出来之后大&#xff0c;偏到很高和左的位置&#xff1b; 它之前的摄像机位置&#xff0c; Position"9.94759830064…

nodejs:nrm(npm的镜像源管理器)

nrm&#xff08;Npm Registry Manager&#xff09;是一个用于快速切换和管理Node.js包管理器npm的镜像源&#xff08;registry&#xff09;的工具。 通过nrm&#xff0c;开发者可以轻松查看当前使用的npm源、添加新的镜像源、测试不同镜像源的速度&#xff0c;并在多个镜像源之…

C++入门2

目录 前言&#xff1a; 引用 引用特性&#xff1a; 常引用&#xff1a; 使用场景&#xff1a; 1. 做参数 2. 做返回值 3.引用做返回值(方便读写返回变量&#xff09; 传值、传引用效率比较: 引用和指针的区别: 内联函数 auto关键字(C11) auto的使用细则&#xff1a…

Leetcoder Day21| 回溯理论基础+组合

语言&#xff1a;Java/Go 回溯理论基础 回溯函数也就是递归函数&#xff1b; 所有回溯法的问题都可以抽象为树形结构&#xff1b; 回溯法解决的都是在集合中递归查找子集&#xff0c;集合的大小就构成了树的宽度&#xff0c;递归的深度&#xff0c;都构成的树的深度。 适用的题…

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

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

ERROR: No matching distribution found for json

问题描述 安装 json库 的时候&#xff0c;一直报错&#xff1a; 解决方案&#xff1a; 大多数博文分享是&#xff1a;①网络问题&#xff0c;换国内镜像&#xff1b;②更新pip. 少有人提及在Python 3.10.1中&#xff0c;它叫 simplejson 了 pip install simplejson 参考&am…

【Golang】Golang使用embed加载、打包静态资源文件

【Golang】Golang使用embed加载、打包静态资源文件 大家好 我是寸铁&#x1f44a; 总结了一篇Golang使用embed加载静态资源文件的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 事情是这样的&#xff1a;前不久&#xff0c;有同学问我,golang怎么把静态资源文件打包成一…

在Ubuntu 16.04 LTS Xenial上安装最新的Linux manual page(man)中文手册manpages-zh(v1.6.4)

0. 写在前面 0.1 我的环境介绍 先说明&#xff0c;我的在虚拟机中装的Ubuntu 16.04 LTS Xenial。为什么要介绍这个呢&#xff1f;因为这个鸟系统太老了&#xff01;所以用apt安装的好多工具版本都好老&#xff01;由此用apt安装就会出现无穷无尽的问题。。。。。所以好多都要…

计算机设计大赛 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

[算法沉淀记录] 排序算法 —— 冒泡排序

排序算法 —— 冒泡排序 基本概念 冒泡排序是一种简单的排序算法。它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;并交换它们的位置&#xff0c;如果它们不是按照升序排列的。这步遍历是重复进行的&#xff0c;直到没有再需要交换&#xff0c;也就是说该…