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

TensorFlow深度学习实战(6)——回归分析详解

TensorFlow深度学习实战(6)——回归分析详解

    • 0. 前言
    • 1. 回归分析简介
    • 2. 线性回归
      • 2.1 简单线性回归
      • 2.2 多重线性回归
      • 2.3 多元线性回归
    • 3. 构建基于线性回归的神经网络
      • 3.1 使用 TensorFlow 进行简单线性回归
      • 3.2 使用 TensorFlow 进行多元线性回归和多重线性回归
    • 小结
    • 系列链接

0. 前言

回归分析 (Regression Analysis) 是一种统计方法,用于研究一个或多个自变量(输入变量)与因变量(输出变量)之间的关系,通过建立数学模型来预测或解释因变量的变化,理解变量之间的相互作用或进行预测。

1. 回归分析简介

回归分析通过学习给定一组因变量和自变量之间的关系从数据中进行预测。只要涉及到分析两个或多个事物之间的关系时,回归分析都有其应用。
以房价估计为例,房价可能受到许多因素的影响:房间数量、房屋面积、地理位置、设施的可用性、停车位等等,回归分析可以找出这些因素与房价之间的数学关系。
简化此问题,假设房屋价格仅由房屋面积决定。利用回归分析,我们可以确定房屋面积(自变量:不依赖于其他变量的变量)与房价(因变量:依赖于一个或多个自变量的变量)之间的关系。之后,只需知道房屋面积,我们就可以利用这种关系来预测房屋的价格。在机器学习中,自变量通常作为模型的输入,而因变量则是模型的输出。
根据自变量的数量、因变量的数量以及关系类型,回归分析有许多不同的类型。回归分析的两个重要组成部分是自变量和因变量之间的关系,以及不同自变量对因变量的影响力。接下来,我们将学习线性回归技术。

2. 线性回归

线性回归已有200多年历史,是最广为人知的建模技术之一。线性回归假设输入变量 X X X 与输出变量 Y Y Y 之间存在线性关系,基本思想是构建一个模型,利用训练数据来预测给定输入的输出,使得预测输出 Y ^ \hat{Y} Y^ 尽可能接近观察到的训练数据输出 Y Y Y。为预测值 Y ^ \hat{Y} Y^ 构建一个线性方程,形式如下:
Y ^ = W T X + b \hat{Y}=W^TX+b Y^=WTX+b
其中 X = { x 1 , x 2 , . . . , x n } X=\{x_1,x_2,...,x_n\} X={x1,x2,...,xn} 是包含 n n n 个变量的输入, W = { w 1 , w 2 , . . . . , w n } W=\{w_1,w_2,....,w_n\} W={w1,w2,....,wn} 是线性系数, b b b 是偏置项。可以将上述方程扩展为:
Y ^ = ∑ i = 1 x i w i + b \hat{Y}=\sum_{i=1}x_iw_i+b Y^=i=1xiwi+b
偏置项提供了一个选项来调整数据以获得更好的拟合。对于输入样本 i i i,观察值 Y Y Y 与预测值 Y ^ \hat Y Y^ 之间的误差为:
e i = Y i − Y ^ i e_i=Y_i-\hat Y_i ei=YiY^i
目标是找到最佳的系数 W W W 和偏置项 b b b 的估计值,使得观察值 Y Y Y 与预测值 Y ^ \hat Y Y^ 之间的误差最小化。接下来,我们通过实际示例来进一步理解回归分析。

2.1 简单线性回归

如果只考虑一个自变量和一个因变量,就是简单线性回归。以房价预测为例,房屋面积 A A A 是自变量,房屋价格 Y Y Y 是因变量。我们希望找到预测价格 Y ^ \hat Y Y^ A A A 之间的线性关系,形式如下:
Y ^ = A W + b \hat Y=AW+b Y^=AW+b
其中 b b b 是偏置项。因此,我们需要确定 W W W b b b,使得价格 Y Y Y 和预测价格 Y ^ \hat Y Y^ 之间的误差最小化。用于估计 W W W b b b 的标准方法称为最小二乘法,即试图最小化误差平方和 S S S,具体到房价预测问题,表达式为:
S ( W , b ) = ∑ i = 1 N ( Y i − Y ^ i ) 2 = ∑ i = 1 N ( Y i − A i W − b ) 2 S(W,b)=\sum_{i=1}^{N}(Y_i-\hat Y_i)^2=\sum_{i=1}^{N}(Y_i-A_iW-b)^2 S(W,b)=i=1N(YiY^i)2=i=1N(YiAiWb)2
目标是估计回归系数 W W W b b b,使得 S S S 最小化。利用函数的导数在极小值处为 0 的性质,可以得到以下两个方程:
∂ S ∂ W = − 2 ∑ i = 1 N ( Y i − A i W − b ) A i = 0 ∂ S ∂ b = − 2 ∑ i = 1 N ( Y i − A i W − b ) = 0 \frac {\partial S} {\partial W}=-2\sum_{i=1}^{N}(Y_i-A_iW-b)A_i=0\\ \frac {\partial S} {\partial b}=-2\sum_{i=1}^{N}(Y_i-A_iW-b)=0 WS=2i=1N(YiAiWb)Ai=0bS=2i=1N(YiAiWb)=0
根据以上两个方程可以求解出两个未知数。首先,将第二个方程中的求和部分展开:
∑ i = 1 N Y i − ∑ i = 1 N A i W − ∑ i = 1 N b = 0 \sum_{i=1}^{N}Y_i-\sum_{i=1}^{N}A_iW-\sum_{i=1}^{N}b=0 i=1NYii=1NAiWi=1Nb=0
观察左侧的最后一项,它只是常数 b b b 求了 N N N 次和。因此,可以重写为:
∑ i = 1 N Y i − W ∑ i = 1 N A i − N b = 0 \sum_{i=1}^{N}Y_i-W\sum_{i=1}^{N}A_i-Nb=0 i=1NYiWi=1NAiNb=0
重新排列项,得到:
b = 1 N ∑ i = 1 N Y i − W N ∑ i = 1 N A i b=\frac 1N\sum_{i=1}^{N}Y_i-\frac WN\sum_{i=1}^{N}A_i b=N1i=1NYiNWi=1NAi
右侧的两项可以分别用 Y ‾ \overline Y Y (平均价格)和 A ‾ \overline A A (平均面积)来替代,于是得到:
b = Y ‾ − W A ‾ b=\overline Y-W\overline A b=YWA
类似地,展开 S S S 关于权重 W W W 的偏导数方程:
∑ i = 1 N ( Y i A i − A i 2 W − b A i ) = 0 \sum_{i=1}^{N}(Y_iA_i-A_i^2W-bA_i)=0 i=1N(YiAiAi2WbAi)=0
将偏置项 b b b 的表达式代入:
∑ i = 1 N ( Y i A i − A i 2 W − ( Y ‾ − W A ‾ ) A i ) = 0 \sum_{i=1}^{N}(Y_iA_i-A_i^2W-(\overline Y-W\overline A)A_i)=0 i=1N(YiAiAi2W(YWA)Ai)=0
重新排列方程:
∑ i = 1 N ( Y i A i − Y ‾ A i ) − W ∑ i = 1 N ( A i 2 − A ‾ A i ) = 0 \sum_{i=1}^{N}(Y_iA_i-\overline YA_i)-W\sum_{i=1}^{N}(A_i^2-\overline AA_i)=0 i=1N(YiAiYAi)Wi=1N(Ai2AAi)=0
通过平均值的定义,可以得到权重 W 的值:
W = ∑ i = 1 N A i ( Y i − Y ‾ ) ∑ i = 1 N ( A i 2 − A ‾ A i ) W=\frac{\sum_{i=1}^{N}A_i(Y_i-\overline Y)}{\sum_{i=1}^{N}(A_i^2-\overline AA_i)} W=i=1N(Ai2AAi)i=1NAi(YiY)
其中 Y ‾ \overline Y Y A ‾ \overline A A 分别是平均价格和平均面积,接下来,我们在一些简单的数据样本上实现简单线性回归方法。

(1) 导入所需的库,使用 NumPypandasMatplotlib

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

(2) 接下来,生成具有线性关系的随机数据,通过添加随机噪声使数据更真实。可以看到这两个变量(自变量 area 和因变量 price )遵循线性关系:

area = 2.5 * np.random.randn(100) + 25
price = 25 * area + 5 + np.random.randint(20,50, size = len(area))
data = np.array([area, price])
data = pd.DataFrame(data = data.T, columns=['area','price'])
plt.scatter(data['area'], data['price'])
plt.show()

简单线性回归

(3) 使用上述方程计算两个回归系数,可以看到结果非常接近我们模拟的线性关系:

W = sum(area*(price-np.mean(price))) / sum(area**2-(area*np.mean(area)))
b = np.mean(price) - W*np.mean(area)
print("The regression coefficients are", W,b)
# The regression coefficients are 24.618504156519812 48.05013397684468

(4) 尝试使用得到的权重和偏置值来预测新的房屋价格:

y_pred = W * area + b

(5) 接下来,绘制预测的价格以及实际价格,可以看到预测价格与面积之间存在线性关系:

plt.plot(area, y_pred, color='red',label="Predicted Price")
plt.scatter(data['area'], data['price'], label="Training Data")
plt.xlabel("Area")
plt.ylabel("Price")
plt.legend()
plt.show()

预测结果

从图中可以看出,预测值与实际房价呈相同的趋势。

2.2 多重线性回归

在大多数问题中,因变量依赖于多个自变量。多重线性回归寻找多个独立输入变量 X X X 和依赖输出变量 Y Y Y 之间的线性关系,使得它们满足以下形式的预测值 Y ^ \hat Y Y^
Y ^ = W T X + b \hat Y=W^TX+b Y^=WTX+b
其中 X = { x 1 , x 2 , . . . , x n } X=\{x_1,x_2,...,x_n\} X={x1,x2,...,xn} n n n 个独立输入变量, W = { w 1 , w 2 , . . . , w n } W=\{w_1,w_2,...,w_n\} W={w1,w2,...,wn} 是线性系数, b b b 是偏置项。
线性系数 W W W 使用最小二乘法估计,即最小化预测值 Y ^ \hat Y Y^ 与观察值 Y Y Y 之间的平方差,尝试最小化损失函数(即平方误差,如果除以 n ,则为均方误差):
l o s s = ∑ i ( Y i − Y ^ i ) 2 loss=\sum_i(Y_i-\hat Y_i)^2 loss=i(YiY^i)2
其中求和操作会遍历所有训练样本。我们将得到 n + 1 n+1 n+1 个方程需要求解。更简单的选择是使用 TensorFlow,下一节中,我们将使用 TensorFlow API 执行回归任务。

2.3 多元线性回归

有某些情况下,自变量可能会影响多个因变量。例如,我们要预测火箭的速度和二氧化碳排放量的情况,这两个变量将作为因变量,并且它们都受到燃料量、引擎类型、火箭机体等的影响。这就是多元线性回归的情况,数学上,多元回归模型可以表示为:
Y ^ i j = w 0 j + ∑ k = 1 p w k j x i j \hat Y_{ij} = w_{0j} + \sum_{k=1}^pw_{kj}x_{ij} Y^ij=w0j+k=1pwkjxij
其中 i ∈ [ 1 , … , n ] i \in [1, \ldots, n] i[1,,n] 表示输入样本的索引, j ∈ [ 1 , … , m ] j \in [1, \ldots, m] j[1,,m] 表示预测输出值的索引。 Y ^ i j \hat Y_{ij} Y^ij 表示第 i i i 个输入样本对应的第 j j j 个预测输出值, w w w 表示回归系数, x i k x_{ik} xik 是第 i i i 个输入样本的第 k k k 个特征。在这种情况下,需要求解的方程数量为 n × m n \times m n×m。虽然我们可以使用矩阵来解这些方程,但该过程计算成本高昂,因为需要计算逆矩阵和行列式。更简单的方法是使用梯度下降法,以最小化平方误差和作为损失函数,并使用 TensorFlow API 中的优化器。

3. 构建基于线性回归的神经网络

在上一小节中,我们使用数学表达式来计算线性回归方程的系数。在本节中,我们将学习如何使用神经网络执行回归任务,并使用 TensorFlow 构建神经网络模型。
在使用神经网络进行回归之前,我们首先回顾一下神经网络的基本概念。简单地说,神经网络是许多人工神经元组成的网络,最简单的神经网络,即简单感知器,可以用数学方式表示为:
y = f ( W T x + b ) y=f(W^Tx+b) y=f(WTx+b)
其中 f f f 是激活函数,如果我们将 f f f 设置为线性函数,那么上述表达式就类似于线性回归表达式。换句话说,我们也可以将神经网络称为函数逼近器,是一种广义的回归器。接下来,使用 TensorFlow 构建一个简单的神经网络回归器。

3.1 使用 TensorFlow 进行简单线性回归

我们已经学习了如何使用 TensorFlow 构建神经网络模型。在本节中,我们将使用 Sequential API 构建一个单层感知器(全连接神经网络),使用 Dense 类,根据给定其面积预测房屋价格。

(1) 首先,导入所需的库:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow.keras as K
from tensorflow.keras.layers import Dense

(2) 接下来,生成数据:

area = 2.5 * np.random.randn(100) + 25
price = 25 * area + 5 + np.random.randint(20,50, size = len(area))
data = np.array([area, price])
data = pd.DataFrame(data = data.T, columns=['area','price'])
plt.scatter(data['area'], data['price'])
plt.show()

(3) 神经网络的输入应该进行归一化处理;这是因为输入会与权重相乘,如果输入值很大,乘积的结果也会很大,最终可能会超出计算机能够处理的最大值:

data = (data - data.min()) / (data.max() - data.min())  #Normalize

(4) 构建模型,由于需要构建简单的线性回归器,使用只有一个神经元的 Dense 层:

model = K.Sequential([Dense(1, input_shape = [1,], activation=None)])
model.summary()

模型架构

(5) 训练模型,定义损失函数和优化器。损失函数定义了模型试图最小化的量,优化器决定了使用的最小化算法。此外,定义评价指标作为模型训练时要记录的量。使用 compile() 函数定义损失函数、优化器和评价指标:

model.compile(loss='mean_squared_error', optimizer='sgd')

(6) 模型定义好后,使用 fit() 函数进行训练。使用的批大小为 32,使用 fit() 函数的 validation_split 参数将数据分割成训练和验证数据集:

model.fit(x=data['area'],y=data['price'], epochs=100, batch_size=32, verbose=1, validation_split=0.2)

模型训练

(7) 训练了 100 个epochs后,训练数据的均方误差为 0.0012,验证数据的均方误差为 0.0011,使用 predict() 函数获取给定输入的预测值:

y_pred = model.predict(data['area'])

(8) 可视化预测数据和实际数据:

plt.plot(data['area'], y_pred, color='red',label="Predicted Price")
plt.scatter(data['area'], data['price'], label="Training Data")
plt.xlabel("Area")
plt.ylabel("Price")
plt.legend()
plt.show()

下图显示了预测数据与实际数据之间的关系图。可以看到,就像线性回归一样,得到了一个良好的线性拟合:

训练结果

(9) 通过打印模型权重查看权重 W W W 和偏置 b b b

print(model.weights)

模型权重

可以看到权重 W = 1.1668608 W=1.1668608 W=1.1668608 和偏置 b = − 0.0682285 b=-0.0682285 b=0.0682285。因此,使用线性回归,可以得到房屋价格与其面积之间的线性关系。

3.2 使用 TensorFlow 进行多元线性回归和多重线性回归

在上一节中,只有一个自变量,即房屋的面积,和一个因变量,即房屋的价格。然而,现实生活中的问题并不是那么简单;我们可能有多个自变量,并且需要预测多个因变量,这涉及解决多个方程。通过使用 TensorFlow 可以更容易解决问题,可以使用多个网络层创建深度神经网络,即应用多个函数逼近器:
f ( x ) = f L ( f L − 1 ( … f 1 ( x ) ) ) f(x)=f_L(f_{L-1}(\ldots f_1(x))) f(x)=fL(fL1(f1(x)))
在上述表达式中,如果 f L f_L fL 是一个线性函数,那么添加多层神经网络并不能提高模型性能,使用非线性激活函数能够将神经网络应用于因变量和自变量,以非线性方式解决相关的回归问题。在本节中,我们将使用 TensorFlow 构建一个深度神经网络,在给定汽车气缸数、排量、加速度等信息的情况下,预测汽车的燃油效率。

(1) 首先,导入所需库。在上一小节中,使用 DataFrame 操作来对数据进行归一化。在本节中,使用 Normalization 层,Normalization 层将数据调整到均值为 0、标准差为 1;此外,由于有多个自变量,使用 Seaborn 来可视化不同变量之间的关系:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow.keras as K
from tensorflow.keras.layers import Dense, Normalization
import seaborn as sns

(2)UCI 机器学习库下载数据集:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data' 
column_names = ['mpg', 'cylinders', 'displacement', 'horsepower', 'weight','acceleration', 'model_year', 'origin']data = pd.read_csv(url, names=column_names,na_values='?', comment='\t',sep=' ', skipinitialspace=True)

(3) 数据包含八个特征:mpg (每加仑英里数)、汽缸数、排量、马力、重量、加速度、型号年份和原产地。虽然车辆的原产地也会影响到燃油效率 mpg,但本节中,我们只使用其它六个特征来预测 mpg 值。此外,丢弃包含 NaN 值的行:

data = data.drop('origin', axis=1)
print(data.isna().sum())
data = data.dropna()

(4) 将数据集分为训练集和测试集,将 392 个数据点中的 80% 作为训练数据,20% 作为测试数据集:

train_dataset = data.sample(frac=0.8, random_state=0)
test_dataset = data.drop(train_dataset.index)

(5) 接下来,使用Seabornpairplot 可视化不同变量之间的关系:

sns.pairplot(train_dataset[['mpg', 'cylinders', 'displacement','horsepower', 'weight', 'acceleration', 'model_year']], diag_kind='kde')
plt.show()

可以看到,mpg (燃油效率)与其他变量都有关系,且是非线性的:

变量之间的关系

(6) 将变量分为输入变量和我们要预测的结果值:

train_dataset.describe().transpose()[['mean', 'std']]train_features = train_dataset.copy()
test_features = test_dataset.copy() train_labels = train_features.pop('mpg')
test_labels = test_features.pop('mpg')

(7) 使用 Normalization 层对数据进行标准化。需要注意的是,虽然我们将输入数据标准化为均值为 0,标准差为 1,但输出预测值 mpg 保持不变:

data_normalizer = Normalization(axis=1)
data_normalizer.adapt(np.array(train_features))

(8) 构建模型。模型有两个隐藏层,分别包含 64 个和 32 个神经元。对于隐藏层,使用 ReLU 作为激活函数,有助于逼近燃油效率与其他变量之间的非线性关系:

model = K.Sequential([data_normalizer,Dense(64,  activation='relu'),Dense(32,  activation='relu'),Dense(1,  activation=None)
])
model.summary()

(9) 使用 Adam 优化器和均方误差损失函数编译模型:

model.compile(optimizer='adam', loss='mean_squared_error')

(10) 对模型训练 100epochs

history = model.fit(x=train_features,y=train_labels, epochs=100, verbose=1, validation_split=0.2)

(11) 模型训练完成后,通过绘制损失曲线检查模型是否过拟合。随着训练 epoch 的增加,验证损失和训练损失接近,这表明模型的训练得当:

plt.plot(history.history['loss'], label='loss')
plt.plot(history.history['val_loss'], label='val_loss')
plt.xlabel('Epoch')
plt.ylabel('Error [MPG]')
plt.legend()
plt.show()

训练过程监测

(12) 最后,比较在测试数据集上预测的燃油效率和真实的燃油效率。如果模型学习了输入和燃油效率之间的关系,预测值和真实值应该形成线性关系:

y_pred = model.predict(test_features).flatten()
plt.scatter(test_labels, y_pred)
plt.xlabel('True Values [MPG]')
plt.ylabel('Predictions [MPG]')
lims = [0, 50]
plt.plot(lims, lims)
plt.show()

预测结果

(13) 绘制预测值与真实燃油效率之间的误差:

error = y_pred - test_labels
plt.hist(error, bins=30)
plt.xlabel('Prediction Error [MPG]')
plt.ylabel('Count')
plt.show()

预测误差

如果想要进行多个预测,也就是处理多元(变量)回归问题,唯一的变化是最后一个 Dense 层的神经元数量将与要预测的变量数目相同。例如,需要通过学生的 SAT 成绩、出勤情况等,预测学生大学四年的 GPA 分数,那么输出层将有四个神经元。

小结

回归分析用于建立变量之间的数学模型,分析其关系,并进行预测。通过合理选择回归模型并确保假设条件成立,回归分析能够帮助决策和优化策略。本节中,首先介绍了线性回归,并用线性回归来预测简单的单变量房价情况,然后使用 TensorFlow 构建了简单和多重线性回归模型。

系列链接

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(4)——正则化技术详解
TensorFlow深度学习实战(5)——神经网络性能优化技术详解

相关文章:

TensorFlow深度学习实战(6)——回归分析详解

TensorFlow深度学习实战(6)——回归分析详解 0. 前言1. 回归分析简介2. 线性回归2.1 简单线性回归2.2 多重线性回归2.3 多元线性回归 3. 构建基于线性回归的神经网络3.1 使用 TensorFlow 进行简单线性回归3.2 使用 TensorFlow 进行多元线性回归和多重线性…...

Deepseek v3R1 学习笔记

o1 o1 模型在训练过程中混合了多种奖励函数的设计方法,并且尝试从结果监督转向过程监督,在中间过程进行打分 使用的搜索策略:基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始,完全由强化学习驱动,不…...

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...

lmk内存压力测试工具mem-pressure源码剖析

背景: android系统开发过程中,经常会遇到一些low memory kill的问题,在分析这些系统低内存导致被杀问题时候,经常因为不好复现而成为一个比较烦恼的阻碍。因为这种低内存问题本身就不属于一种功能操作类型的问题,属于…...

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…...

【大模型】AI 辅助编程操作实战使用详解

目录 一、前言 二、AI 编程介绍 2.1 AI 编程是什么 2.1.1 为什么需要AI辅助编程 2.2 AI 编程主要特点 2.3 AI编程底层核心技术 2.4 AI 编程核心应用场景 三、AI 代码辅助编程解决方案 3.1 AI 大模型平台 3.1.1 AI大模型平台代码生成优缺点 3.2 AI 编码插件 3.3 AI 编…...

Eclipse IDE 快捷键大全

文章目录 简介 ✨常用编辑快捷键 ⌨️基础编辑操作查找和定位代码优化 调试快捷键 🐛编辑器通用快捷键 📝窗口操作快捷键 🪟特殊功能快捷键 🔧重构相关快捷键 🔄提示 💡 简介 ✨ Eclipse 作为一款强大的集…...

ES面试题

1、Elasticsearch的基本构成: (1)index 索引: 索引类似于mysql 中的数据库,Elasticesearch 中的索引是存在数据的地方,包含了一堆有相似结构的文档数据。 (2)type 类型&#xff1a…...

设置git区分大小写

设置git区分大小写 1.全局设置 (影响全部仓库): git config --global core.ignorecase false2.仓库级别设置 (影响当前仓库): git config core.ignorecase false3.已经提交了大小写不一致的文件处理: git mv -f OldName newName # 强制重命名 git commit -m "Fix cas…...

0205算法:最长连续序列、三数之和、排序链表

力扣128:最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 class Solution {public int longestConsecutive(in…...

VLAN 基础 | 不同 VLAN 间通信实验

注:本文为 “ Vlan 间通信” 相关文章合辑。 英文引文,机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信? Posted on November 20, 2015 by RouterSwi…...

DeepSeek各版本说明与优缺点分析

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处&#xff0…...

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下,我们来学习下图的中篇!!! 一、图的遍历 图的遍历指的是遍历图中的顶点,主要有 广度优先遍历 …...

协同探索与导航文献整理

文章目录 1.SOAR:异构无人机协同探索与拍摄以实现快速自主重建2. RACER: 一种使用分散式无人机群进行快速协同探索的方法3. 使用协作式纳米无人机在非结构化环境中进行最小感知探索4.GVP-MREP:通过动态拓扑图上的 Voronoi 分区进行快速且通信高效的多无人机探索5.森林的快速多无…...

排序算法--计数排序

唯一种没有比较的排序(指没有前后比较,还是有交换的)。统计每个元素出现的次数,直接计算元素在有序序列中的位置,要求数据是整数且范围有限。适用于数据为小范围整数(如年龄、成绩),数据重复率较高时效率更优。可用于小…...

吴恩达深度学习——对象检测

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 对象定位特征点检测基于滑动窗口的目标检测算法原理将全连接层转化成卷积层通过卷积实现滑动窗口检测算法 YOLOBounding Box预测交并比非极大值抑制Anchor BoxYOLO检测训练集中预…...

BUU19 [BJDCTF2020]Easy MD51

题目 当点进去不知道干啥的时候:1.看源代码 2.抓包 3.看网络请求 F12 用bp抓包,在response消息头中有hint提示: select * from admin where passwordmd5($pass,true) 如果md5($pass,true)后是 or 1 那么整句话就是password or 1&a…...

蓝桥杯刷题DAY2:二维前缀和 一维前缀和 差分数组

闪耀的灯光 📌 题目描述 蓝桥公园是一个适合夜间散步的好地方,公园可以被视为由 n m 个矩形区域构成。每个区域都有一盏灯,初始亮度为 a[i][j]。 小蓝可以选择一个大的矩形区域,并按下开关一次,这将使得该区域内每盏…...

HTB:EscapeTwo[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

vue 引入百度地图和高德天气 都得获取权限

vue接入百度地图---获取ak https://blog.csdn.net/qq_57144407/article/details/143430661 vue接入高德天气, 需要授权----获取key https://www.jianshu.com/p/09ddd698eebe...

AI大模型:DeepSeek

近期DeepSeek产生了很大的影响力。首先来自于性能,给了业内一个很好的释放,缓解了HPC以及大规模集群被卡的焦虑。通过实验证实了小规模团队(公开资料显示规模约150左右)在资源受限的情况下(2M H100 GPU时),依然可以完成对领先大模型的实现与部署。后续观察该团队是否可以…...

LeetCode - #198 打家劫舍

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

从离散傅里叶变换(DFT)到快速傅里叶变换(FFT)

摘要 离散傅里叶变换(DFT)是数字信号处理领域中分析信号频域特性的重要工具,但直接计算DFT的复杂度较高,限制了其在大规模数据处理中的应用。快速傅里叶变换(FFT)的出现显著降低了计算复杂度,极…...

【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统

【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…...

Math Reference Notes: 符号函数

1. 符号函数的定义 符号函数(Sign Function) sgn ( x ) \text{sgn}(x) sgn(x) 是一个将实数 ( x ) 映射为其 符号值(即正数、负数或零)的函数。 它的定义如下: sgn ( x ) { 1 如果 x > 0 0 如果 x 0 − 1 如…...

拉格朗日乘数法算法详解Python实现

目录 一、拉格朗日乘数法算法详解1.1 基本思想1.2 数学推导1.3 算法步骤1.4 算法在编程中的实现 二、案例分析案例一:二维最优化问题——求 f ( x , y ) x 2 y 2 f(x,y)x^2y^2 f(x,y)x2y2 在约束 x y 1 xy1 xy1 下的极值2.1.1 问题描述2.1.2 数学模型构建2.1.…...

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天,IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上,IP属地的显示往往让人联想到用户的地理位置。然而,关于IP属地到底与手机号还是手机位置有关,却存在着不少误解和混淆。本文将深入…...

C++常用拷贝和替换算法

算法简介: copy // 容器内指定的元素拷贝到另一容器replace // 将容器内指定范围的旧元素改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap //互换两个容器的元素 1. copy 功能描述: 将容器内指定范围的数据拷贝到另一容器中函…...

vue项目搭建

1.准备工作,按照下面的安装一下脚手架vue-cli node16安装vue-cli时报错:需要node>20(但根本就不是版本问题)-CSDN博客文章浏览阅读157次,点赞4次,收藏2次。这种情况我碰到不下5次了&#xff0c…...

Java进阶面试八股文

1、Java SE和Java EE区别? Java SE 是 Java 的基础版本,Java EE 是 Java 的高级版本。Java SE 更适合开发桌面应用程序或简单的服务器应用程序,Java EE 更适合开发复杂的企业级应用程序或 Web 应用程序。 2、JVM和JRE和JDK区别?…...

Python Django 嵌入 Grafana Dashboard(随手记)

作为一名网络工程师/运维工程师,现在都在往DevOps的方向发展。其中大家都不可避免的会往自己开发平台的方向发展。 那么如何将自己制作的 Grafana 面板 引入到自己的平台上? 一般来说,大家都会选择Python来作为自己开发的语言,并会…...

[Android] IKTV专享版

[Android] IKTV专享版 链接:https://pan.xunlei.com/s/VOILXXuEd3ASo93c88UW79sxA1?pwd4tsw# 2025年2月最新免费K歌神器!家庭KTV软件,手机平板电视盒子电脑都可用...

阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存

技术一面 20 分钟 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3、找到单链表的三等分点,如果单链表是有环的…...

C++多线程编程——call_once和单例模式

目录 1. 前言 2. call_once和once_flag 3. 后记 3.1 单例类的析构问题 3.2 饿汉式单例模式的线程安全问题 1. 前言 之前在讲解单例模式时,有提到懒汉式单例模式使用了双重检测Double-Checked Locking Pattern (DCLP)来解决多线程的安全访问问题。但是该方法也…...

vue2-为啥data属性是一个函数而不是对象

vue2-为啥data属性是一个函数而不是对象 1. data在vue实例和组件中的表现差异 vue实例的时候,data既可以是一个对象也可以是一个函数 new Vue({data:{//对象name:tom},data(){//函数return{name:tom}} })而在组件中定义data,只能是函数,如…...

Spark--算子执行原理

一、sortByKey SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。 内部执行流程 1、创建RangePartitioner part&…...

keil 单步调试

一、常见错误分析 warningerror警告错误 不影响编译过程 能够输出Hex文件 无法完成编译 不输出Hex文件 注意的是,warning的信息是要去关注的。 下面的UNCALLED SEGMENT除外 二、单步调试配置 1、在keil中添加单片机型号 本文不详细介绍,如有需要可查看这篇文章:...

html的字符实体和颜色表示

在HTML中,颜色可以通过以下几种方式表示,以下是具体的示例: 1. 十六进制颜色代码 十六进制颜色代码以#开头,后面跟随6个字符,每两个字符分别表示红色、绿色和蓝色的强度。例如: • #FF0000:纯红…...

[数据结构] 线性表和顺序表

目录 线性表 顺序表的实现 顺序表各个方法的实现 boolean isFull() -- 判断数组是否放满 : void add(int data) -- 在数组末尾插入新元素 : void add(int pos,int data) -- 在指定位置插入元素 : boolean contain(int toFind) -- 判断是否包含某个元素 int indexOf(in…...

第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)

目录 1. 前言 2. TransUnet 和 SwinUnet 3. 腹部多器官分割 4. 训练 5. 推理 6. 项目下载 1. 前言 TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性&…...

DS图(下)(19)

文章目录 前言一、最短路径的概念二、单源最短路径-Dijkstra算法三、单源最短路径-Bellman-Ford算法四、多源最短路径-Floyd-Warshall算法总结 前言 加油,今天就是图的最后一篇了,撑住!!   今天我们要学的就是最短路径问题&…...

鸿蒙Harmony-Progress组件概述

鸿蒙Harmony-Progress组件概述 1.1Progress组件概述 作用:显示操作或任务的进度,支持线性,环形,刻度等多种样式适用场景:文件上传/下载、任务完成度、系统状态反馈等 2.1基础属性(参考官方文档&#xff…...

流数据库中的RisingWave和Materialize

流数据库(Streaming Database)是一种专门设计用于处理大量实时流数据的数据库,它能够在数据生成时立即进行处理,从而实现实时洞察和分析。RisingWave和Materialize都是这一领域的代表性技术。RisingWave和Materialize都是强大的流…...

【C++】多态详细讲解

本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态:主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通…...

防火墙的安全策略

1.VLAN 2属于办公区;VLAN 3属于生产区,创建时间段 [FW]ip address-set BG type object [FW-object-address-set-BG]address 192.168.1.0 mask 25 [FW]ip address-set SC type object [FW-object-address-set-SC]address 192.168.1.129 mask 25 [FW]ip address-se…...

Android 进程间通信

什么是IPC? Android 进程间通信(IPC,Inter-Process Communication)是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统,每个应用通常运行在自己的进程中,以提高安全性和…...

【优先算法】专题——位运算

在讲解位运算之前我们来总结一下常见的位运算 一、常见的位运算 1.基础为运算 << &&#xff1a;有0就是0 >> |&#xff1a;有1就是1 ~ ^&#xff1a;相同为0&#xff0c;相异位1 /无进位相加 2.给一个数 n&#xff0c;确定它的二进制表示…...

深入理解k8s中的容器存储接口(CSI)

CSI出现的原因 K8s原生支持一些存储类型的PV&#xff0c;像iSCSI、NFS等。但这种方式让K8s代码与三方存储厂商代码紧密相连&#xff0c;带来不少麻烦。比如更改存储代码就得更新K8s组件&#xff0c;成本高&#xff1b;存储代码的bug还会影响K8s稳定性&#xff1b;K8s社区维护和…...

ZZNUOJ(C/C++)基础练习1061——1070(详解版)

目录 1061 : 顺序输出各位数字 C语言版 C版 1062 : 最大公约数 C C 1063 : 最大公约与最小公倍 C C 1064 : 加密字符 C C 1065 : 统计数字字符的个数 C C 1066 : 字符分类统计 C C 1067 : 有问题的里程表 C C 1068 : 进制转换 C C C&#xff08;容器stack…...

ES6 变量解构赋值总结

1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...