掌握线性回归:从简单模型到多项式模型的综合指南
目录
一、说明
二、简单线性回归
三、线性回归的评估指标
3.1 线性回归中的假设
四、从头开始的简单线性回归代码
五、多元线性回归
六、多元线性回归代码
七、多项式线性回归
八、多项式线性回归代码
九、应用单变量多项式回归
十、改变多项式的次数
十一、多列多项式回归
一、说明
数据科学的基础算法在预测连续结果方面起着关键作用。它通过假设独立变量和因变量之间存在线性关系来预测两个变量之间的关系。它寻求最小化预测值和实际值之间平方差之和的最佳直线。该方法应用于经济学和金融学等各个领域,用于分析和预测数据趋势。它可以扩展到涉及多个独立变量的多元线性回归和逻辑回归,适用于二元分类问题。
任何 ML 模型都遵循以下工作流程:
数据 → 模型 → 成本函数 (J) → J 的优化
这里我们将讨论三种类型的线性回归:
- 简单线性回归
- 多元线性回归
- 多项式线性回归
二、简单线性回归
在简单线性回归中,有一个独立变量 (x)和一个因变量 (y)。模型估计最佳拟合线的斜率和截距,表示变量之间的关系。斜率表示独立变量每变化一个单位,因变量的变化量,而截距表示独立变量为零时因变量的预测值。
模型
为了计算最佳拟合线,线性回归使用传统的斜率截距形式的直线:Y = W*X + b,
其中 Y = 因变量,X = 自变量,W = 斜率,b = 常数/截距。
成本函数 (J)
线性回归算法的目标是获得β ₀ 和β ₁ 的最佳值,以找到最佳拟合线。最佳拟合线是误差最小的线,这意味着预测值和实际值之间的误差应该最小。
随机误差:在回归中,因变量(Yi)的观测值与预测值(Y_predicted)之间的差异称为残差或随机误差。
error = Y_predicted - Yi
其中Y_prediced = W*X + b。
最佳拟合线是与给定散点图最佳拟合的线。从数学上讲,最佳拟合线是通过最小化残差平方和 (RSS) 获得的。
成本函数有助于计算出W和b的最优值,从而为数据点提供最佳拟合线。
注意 →成本函数应具有连续性、可微性和凸性。
在线性回归中,使用均方误差 (MSE),即 Y_predicted 和 Yi 之间发生的平方误差的平均值。
梯度下降
梯度下降是一种优化算法,它优化成本函数以达到最佳最小解。为了找到最佳解决方案,我们需要降低所有数据点的成本函数(MSE)。这是通过迭代更新 W 和 b 的值来实现的,直到我们得到最佳解决方案。
回归模型优化梯度下降算法,通过随机选择系数值降低成本函数来更新线的系数,然后迭代更新这些值以达到最小成本函数。
由于我们的成本函数是凸函数,它应该有一个全局最小值,为了达到这个最小值,我们需要采取一些步骤。现在,如果我们采取小步骤,将需要大量时间才能达到最小值,如果我们采取更大的步骤,我们将更快地到达底部,但我们可能会超调。所以在 ML 中,这些步骤被称为学习率,这决定了算法收敛到最小值的速度。
从数学上讲,我们可以通过推导方程并使其等于零(斜率/梯度 = 0)来达到最小值。因此,我们必须根据我们的参数(W 和 b)推导方程,以更新 W 和 b 的值。
梯度下降的推导
我们将通过对 W 和 b 的偏导数来获取成本函数 (J) 的梯度。
这里的偏导数就是梯度,用来更新W和b的值,Alpha就是学习率。
三、线性回归的评估指标
任何线性回归模型的强度都可以使用各种评估指标来评估。这些评估指标通常可以衡量模型生成观察到的输出的效果。
1. 判定系数或 R 平方 (R2)
R 平方是一个数字,它解释了所开发的模型所解释/捕获的变化量。它始终介于 0 和 1 之间。总体而言,R 平方的值越高,模型与数据的拟合效果越好。
残差平方和 (RSS)定义为图/数据中每个数据点的残差平方和。它是预期和实际观测输出之间差异的度量。
总平方和 (TSS)定义为数据点与响应变量平均值的误差之和。
R 平方的重要性如下图所示,
2. 均方根误差 (RMSE) 和残差标准误差 (RSE)
均方根误差是残差方差的平方根。它指定模型与数据的绝对拟合度,即观察到的数据点与预测值的接近程度。从数学上讲,它可以表示为,
为了使该估计无偏,必须将残差平方和除以自由度,而不是模型中的数据点总数。该术语称为残差标准误差 (RSE)。从数学上讲,它可以表示为:
R 平方是比 RMSE 更好的度量。由于均方根误差的值取决于变量的单位(即它不是标准化的度量),因此它可以随着变量单位的变化而变化。
3.1 线性回归中的假设
1. 残差的线性:因变量和自变量之间需要存在线性关系。
2. 残差的独立性:误差项不应相互依赖(例如在时间序列数据中,下一个值依赖于前一个值)。残差项之间不应存在相关性。这种现象的缺失被称为自相关。
3. 残差的正态分布:残差的均值应服从正态分布,均值等于零或接近于零。这样做是为了检查所选线是否真的是最佳拟合线。如果误差项不服从正态分布,则表明存在一些不寻常的数据点,必须仔细研究才能建立更好的模型。
4. 残差方差相等:误差项必须具有恒定方差。这种现象称为同方差性。误差项中存在非常量方差称为异方差性。通常,非常量方差是在存在异常值或极端杠杆值时出现的。
四、从头开始的简单线性回归代码
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
X,y = datasets.make_regression(n_samples=100, n_features=1, noise=20, random_state=4)
X_train, X_test ,y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)fig = plt.figure(figsize=(8,6))
plt.scatter(X[:,0], y, color="b", marker="o", s=30)
plt.show()
第一行生成一个用于简单线性回归问题的合成数据集。它创建X作为输入特征(本例中为单个特征),y作为目标变量。n_samples指定数据点的数量,n_features是数据集中的特征数量(本例中为 1),noise控制数据中的噪声量,random_state确保可重复性。然后,我们使用 scikit-learn 中的train_test_split函数将数据集拆分为训练集和测试集。它采用输入特征 X 和目标变量 y,以及test_size作为要包含在测试拆分中的数据集比例(20%)。我们将使用 Matplotlib 的图形函数创建一个指定大小为8x6 英寸的散点图。X [:,0]从输入特征 X 中选择第一个(也是唯一的)特征。y 是目标变量。color=”b”将标记的颜色设置为蓝色,marker=”o”指定应使用圆形标记,s=30将标记的大小设置为 30 点。
class LinearRegression() : def __init__(self, lr = 0.002, n_iters = 1000):self.lr = lrself.n_iters = n_itersself.weights = Noneself.bias = Nonedef fit(self, X, y):n_samples, n_features = X.shapeself.weights = np.zeros(n_features)self.bias = 0for _ in range(self.n_iters):y_pred = np.dot(X, self.weights) + self.biasdw = (1/n_samples) * np.dot(X.T, (y_pred - y))db = (1/n_samples) * np.sum(y_pred - y)self.weights = self.weights - self.lr * dwself.bias = self.bias - self.lr * dbdef predict(self, X):y_pred = np.dot(X, self.weights) + self.biasreturn y_pred
reg = LinearRegression()
reg.fit(X_train, y_train)
pred = reg.predict(X_test)
print(pred)
此类实现了一个简单的线性回归模型。
__init __()是该类的构造函数方法。它使用两个参数初始化线性回归模型:
- lr:学习率,控制梯度下降时所采取的步长。
- n_iters:梯度下降算法将运行的迭代次数。
fit()函数将模型与训练数据进行拟合。它接受两个参数:输入特征 (X) 和输出目标变量 (y)。此函数将模型的权重和偏差初始化为零。
predict()函数使用学习到的权重和偏差来预测新输入特征“X”的目标变量。
mse = np.mean((y_test - pred)**2)
print(mse) #--> 361.2812896055198
y_pred_line = reg.predict(X)
cmap = plt.get_cmap('viridis')
fig = plt.figure(figsize=(8,6))
m1 = plt.scatter(X_train, y_train, color=cmap(0.9), s=10)
m2 = plt.scatter(X_test, y_test, color=cmap(0.5), s=10)
plt.plot(X, y_pred_line, color='black', linewidth=2, label='Prediction')
plt.show()
五、多元线性回归
多元线性回归是一种理解单个因变量和多个自变量之间关系的技术。多元线性回归的公式也类似于简单线性回归,但有一个细微的变化,即不再只有一个 beta 变量,而是所有使用的变量都有 beta 值。公式如下:Y = W1*X1 + W2*X2 + … + WmXm + b
多元线性回归的考虑
因素 简单线性回归的所有四个假设对于多元线性回归仍然成立,并且还有一些新的附加假设。
1.过度拟合:当向模型中添加越来越多的变量时,模型可能变得过于复杂,通常会记住训练集中的所有数据点。这种现象称为模型的过度拟合。这通常会导致高训练准确率和非常低的测试准确率。
2.多重共线性:这是一种具有多个独立变量的模型中可能有一些变量相互关联的现象。
3.特征选择:随着变量的增多,从给定特征池(其中许多可能是多余的)中选择最佳预测因子集成为构建相关且更好模型的重要任务。
多重共线性由于多重共线性很难找出哪个变量实际上对响应变量的预测有贡献,因此它会导致人们错误地得出变量对目标变量的影响的结论。虽然它不会影响预测的精度,但必须正确检测和处理模型中存在的多重共线性,因为从模型中随机删除任何这些相关变量都会导致系数值大幅波动,甚至改变符号。
可以使用以下方法检测多重共线性。1
. 成对相关性:检查不同对独立变量之间的成对相关性可以为检测多重共线性提供有用的见解。2
. 方差膨胀因子 (VIF):成对相关性可能并不总是有用,因为可能只有一个变量无法完全解释其他变量,但一些变量组合起来可能可以做到这一点。因此,要检查变量之间的这种关系,可以使用 VIF。VIF 基本上解释了一个独立变量与所有其他独立变量之间的关系。VIF 由以下公式给出:
VIF = 1/ (1 - R^2)
对于 VIF 值,常见的启发式方法是,如果 VIF > 10,则该值肯定很高,应将其删除。如果 VIF=5,则它可能有效,但应先进行检查。如果 VIF < 5,则认为这是一个好的 vif 值。
线性回归中的过拟合和欠拟合总是存在模型在训练数据上表现良好但在测试数据上表现不佳的情况。在数据集上训练模型时,过拟合和欠拟合是人们面临的最常见问题。
在理解过度拟合和欠拟合之前,必须了解偏差和方差。
偏差:偏差是一种衡量模型对未来未知数据的准确度的指标。假设有足够的训练数据,复杂的模型可以准确地进行预测。而那些过于简单的模型很可能在预测方面表现不佳。简单地说,偏差是训练数据造成的错误。一般来说
,线性算法的偏差较大,这使得它们学习速度快、更容易理解,但总体而言灵活性较差。这意味着对复杂问题的预测性能较低,无法达到预期结果。
方差:方差是模型对训练数据的敏感度,即它量化了输入数据发生变化时模型的反应程度。理想情况下,模型不应该从一个训练数据集到下一个训练数据发生太大变化,这意味着算法擅长找出输入和输出变量之间隐藏的潜在模式。
理想情况下,模型应该具有较低的方差,这意味着模型在改变训练数据后不会发生剧烈变化(它是可推广的)。方差较高会使模型即使在训练数据集发生微小变化时也发生剧烈变化。
偏差方差权衡
为了追求最佳性能,监督式机器学习算法力求在低偏差和低方差之间取得平衡,以提高稳健性。在机器学习领域,偏差和方差之间存在内在关系,其特点是呈反相关。
- 偏差增加会导致方差减少。
- 相反,方差增大会导致偏差减小。
找到偏差和方差之间的平衡至关重要,算法必须权衡利弊才能获得最佳结果。
在实践中,由于底层目标函数的性质未知,计算精确的偏差和方差误差项具有挑战性。
过度拟合
当模型学习数据中的每个模式和噪声,以至于影响模型在未见的未来数据集上的性能时,这被称为过度拟合。模型与数据的拟合程度很高,以至于它将噪声解释为数据中的模式。
当模型的偏差较低且方差较高时,它最终会记住数据并导致过度拟合。过度拟合会导致模型变得具体而不是通用。这通常会导致训练准确率高但测试准确率非常低。
检测过拟合很有用,但并不能解决实际问题。有几种方法可以防止过拟合,如下所示:
- 交叉验证
- 如果训练数据太小,无法训练,则添加更多相关且干净的数据。
- 如果训练数据太大,请进行一些特征选择并删除不必要的特征。
- 正则化
欠拟合
欠拟合的讨论频率并不像过拟合那么高。当模型无法从训练数据集中学习,也无法推广到测试数据集时,就称为欠拟合。这种类型的问题可以很容易地通过性能指标检测到。
当模型具有高偏差和低方差时,它最终无法概括数据并导致欠拟合。它无法从数据中找到隐藏的底层模式。这通常会导致训练准确率低和测试准确率极低。防止欠拟合的方法如下,
- 增加模型复杂度
- 增加训练数据中的特征数量
- 消除数据中的噪音
六、多元线性回归代码
X, y = datasets.make_regression(n_samples=100, n_features=3, noise=20, random_state=4)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)fig = plt.figure(figsize=(8,6))
plt.scatter(X[:,0], y, color="b", marker="o", s=30)
plt.show()
reg = LinearRegression()
reg.fit(X_train, y_train)pred = reg.predict(X_test)
print(pred)
mse = np.mean((y_test - pred)**2)
print(mse) #--> 698.925115269247
def plot_multiple_linear_regression(X, y, y_pred, title='Multiple Linear Regression'):fig = plt.figure(figsize=(8, 6))ax = fig.add_subplot(111, projection='3d')ax.scatter(X[:, 0], X[:, 1], y, color='blue', label='Actual')ax.scatter(X[:, 0], X[:, 1], y_pred, color='red', label='Predicted')ax.set_xlabel('Feature 1')ax.set_ylabel('Feature 2')ax.set_zlabel('Target')ax.set_title(title)ax.legend()plt.show()
plot_multiple_linear_regression(X_test, y_test, pred)
七、多项式线性回归
简单的线性回归算法仅在数据之间的关系为线性时才有效。但是假设我们有非线性数据,那么线性回归将无法绘制最佳拟合线。在这种情况下,简单回归分析会失败。考虑下图,它具有非线性关系,您可以看到其上的线性回归结果,其表现不佳,这意味着它与现实不相符。因此,我们引入多项式回归来克服这个问题,这有助于识别独立变量和因变量之间的曲线关系。
多项式回归如何处理非线性数据?
多项式回归是线性回归的一种形式,由于因变量和自变量之间存在非线性关系,我们在线性回归中添加一些多项式项以将其转换为多项式回归。
在多项式回归中,因变量和自变量之间的关系被建模为 n 次多项式函数。当多项式的次数为 2 时,它被称为二次模型;当多项式的次数为 3 时,它被称为三次模型,依此类推。
假设我们有一个数据集,其中变量 X 代表独立数据,Y 是因变量。在预处理阶段将数据输入模式之前,我们使用某种程度将输入变量转换为多项式项。
多项式回归模型通常用最小二乘法拟合。最小二乘法在高斯-马尔可夫定理下最小化系数的方差。
八、多项式线性回归代码
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
X = 6 * np.random.rand(200, 1) - 3
y = 0.8 * X**2 + 0.9*X + 2 + np.random.randn(200, 1)plt.plot(X, y, 'b.')
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
我们创建一个形状为 (200, 1) 的数组 X,其中包含-3 和 3之间的随机值。np.random.randn()
用于生成 0 到 1 之间的随机数,然后缩放并移动它们到 -3 到 3 之间。
然后我们根据方程y = 0.8x^2 + 0.9x + 2生成目标变量 y ,其中 x 是输入变量 X。它首先计算(0.8 * X^2)得到二次项,(0.9*X)得到线性项,并为常数项加 2。然后它添加一些随机噪声np.random.randn(200, 1)
以使数据更真实。噪声是从均值为 0 和标准差为 1 的正态(高斯)分布中采样的。
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2)
lr = LinearRegression()
lr.fit(x_train, y_train)
y_pred = lr.predict(x_test)
print(r2_score(y_test, y_pred)) #--> 0.2678387104012654
plt.plot(x_train, lr.predict(x_train), color="r")
plt.plot(X, y, "b.")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()
九、应用单变量多项式回归
poly = PolynomialFeatures(degree=2, include_bias=True)
x_train_trans = poly.fit_transform(x_train)
x_test_trans = poly.transform(x_test)lr = LinearRegression()
lr.fit(x_train_trans, y_train)
y_pred = lr.predict(x_test_trans)
print(r2_score(y_test, y_pred)) #--> 0.7692773830829487
print(lr.coef_)
print(lr.intercept_)
X_new = np.linspace(-3, 3, 200).reshape(200, 1)
X_new_poly = poly.transform(X_new)
y_new = lr.predict(X_new_poly)
plt.plot(X_new, y_new, "r-", linewidth=2, label="Predictions")
plt.plot(x_train, y_train, "b.",label='Training points')
plt.plot(x_test, y_test, "g.",label='Testing points')
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
十、改变多项式的次数
现在我们将设计一个函数来帮助我们找到正确的度值。在这里,我们将上面完成的所有预处理步骤应用到一个函数中,并将最终预测图映射到它上面。我们需要做的就是传递度数,它将建立一个模型并绘制特定度数的图形。在这里,我们将创建一个预处理步骤管道,使流程简化。
数据 → 多项式变换 → 线性回归 → 预测
def polynomial_regression(degree):X_new=np.linspace(-3, 3, 100).reshape(100, 1)X_new_poly = poly.transform(X_new)polybig_features = PolynomialFeatures(degree=degree, include_bias=False)std_scaler = StandardScaler()lin_reg = LinearRegression()polynomial_regression = Pipeline([("poly_features", polybig_features),("std_scaler", std_scaler),("lin_reg", lin_reg),])polynomial_regression.fit(X, y)y_newbig = polynomial_regression.predict(X_new)#plotting prediction lineplt.plot(X_new, y_newbig,'r', label="Degree " + str(degree), linewidth=2)plt.plot(x_train, y_train, "b.", linewidth=3)plt.plot(x_test, y_test, "g.", linewidth=3)plt.legend(loc="upper left")plt.xlabel("X")plt.ylabel("y")plt.axis([-3, 3, 0, 10])plt.show()
当我们运行该函数并传递 10、15 和 20 等高阶数时,模型会尝试过度拟合数据,这意味着预测线会慢慢脱离其原始本质并尝试依赖训练数据点,并且随着训练路径发生一些变化,该线会尝试捕捉该点。
polynomial_regression(10)
polynomial_regression(15)
<polynomial_regression(25)
这是一个高次多项式的问题,我们在实际中可以看到,所以需要选择一个最优的次数值。
十一、多列多项式回归
我们已经了解了单变量多项式回归。大多数情况下,输入数据会有很多列,那么如何应用多项式回归并在三维空间中可视化结果呢?对于大多数初学者来说,这有时感觉是一项繁重的任务,所以让我们来解决这个问题,并了解如何在三维空间中执行多项式回归。
# 3D polynomial regression
x = 7 * np.random.rand(100, 1) - 2.8
y = 7 * np.random.rand(100, 1) - 2.8
z = x**2 + y**2 + 0.2*x + 0.2*y + 0.1*x*y +2 + np.random.randn(100, 1)
import plotly.express as px
df = px.data.iris()
fig = px.scatter_3d(df, x=x.ravel(), y=y.ravel(), z=z.ravel())
fig.show()
X = np.hstack((x, y, x**2, y**2, x*y))
reg = LinearRegression().fit(X, z)# Generate grid points for surface plot
x_input, y_input = np.meshgrid(np.linspace(-2.8, 4.2, 100), np.linspace(-2.8, 4.2, 100))
X_input = np.hstack((x_input.reshape(-1, 1), y_input.reshape(-1, 1), x_input.reshape(-1, 1)**2, y_input.reshape(-1, 1)**2, (x_input.reshape(-1, 1)*y_input.reshape(-1, 1))))
z_final = reg.predict(X_input)
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter3d(x=x.ravel(), y=y.ravel(), z=z.ravel(), mode='markers', marker=dict(size=3), name='Data'))
fig.add_trace(go.Surface(x=x_input, y=y_input, z=z_final.reshape(x_input.shape), name='Fitted Surface'))
fig.update_layout(scene=dict(xaxis_title='X', yaxis_title='Y', zaxis_title='Z'), title='3D Polynomial Regression')
fig.show()
您可以从github查看此处解释的代码。
相关文章:

掌握线性回归:从简单模型到多项式模型的综合指南
目录 一、说明 二、简单线性回归 三、线性回归的评估指标 3.1 线性回归中的假设 四、从头开始的简单线性回归代码 五、多元线性回归 六、多元线性回归代码 七、多项式线性回归 八、多项式线性回归代码 九、应用单变量多项式回归 十、改变多项式的次数 十一、多列多项式回归 一、…...

Java:183 基于SSM的高校食堂系统
项目介绍 基于SSM的食堂点餐系统 角色:管理员、用户、食堂 前台用户可以实现商品浏览,加入购物车,加入收藏,预定,选座,个人信息管理,收货信息管理,收藏管理,评论功能,…...

光谱相机
光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上,在探测器前设置分光元件,如光栅、棱镜或滤光片等,将光按不同波长分解成多个光谱通道,…...

AI绘图:开源Stable Diffusion 3 ComfyUI下载安装方法
AI绘图:开源Stable Diffusion 3 ComfyUI下载安装方法 安装好后软件运行效果: 第一步:安装ComfyUI的最新版本 1、请从下面的地址下载压缩包,并解压缩到硬盘 https://github.com/comfyanonymous/ComfyUI/releases/download/late…...

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测
一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测 目录 一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现INFO-CNN-SVM向量加权算法优化卷积神经网络结…...

AES笔记整理
文章目录 1. 简介2. 密钥加法层2. 字节代换层3. 行位移 - ShiftRows4. 列混淆 - MixColumn5. 其他5.1列混淆矩阵乘法运算5.2 AES密钥生成 6. 参考资料 以下内容为信息安全开发过程中,AES对称加密算法的笔记,大部分内容转载其他文章,若描述不清…...

Jmeter 性能压测-Tomcat连接数
1、影响性能的线程状态 ①BLOCKED,如果线程中有BLOCKED,就代表有阻塞情况,需要进行排查 ②TIMED_WAITING,如果线程中有TIMED_WAITING,就代表有等待的情况,要分情况来排查 系统线程在等待(如果…...
基于Vue3的组件封装技巧分享
1、需求说明 需求背景:日常开发中,我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发,提升效率。有时我们需要进行个性化封装,以满足在项目中大量使用的需求。 错误示范:基于a-modal封装一个自定…...

python中r代表什么意思
r在python中表示什么意思? “r”是“raw”的简写。去查单词,意思是“未加工的,原料”。因此,不难想象,在python字符串前面,表示“按原样输出字符串”,也就是说字符串里的元素,原来什…...
《量子计算对人工智能发展的深远影响》
在科技发展的浪潮中,量子计算与人工智能无疑是两颗璀璨的明星,二者的融合正引领着一场深刻的科技变革. 量子计算的独特之处在于其利用量子比特的叠加和纠缠特性,能够实现并行计算,从而在处理复杂问题时展现出超越传统计算的巨大潜…...

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库
在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用,而不能在服务器组件中使用。Next.js 的新架构(App Router)中,默认情况下,页面和布局组件是服务器组件,因此不能直接使…...

docker启动一个helloworld(公司内网服务器)
这里写目录标题 容易遇到的问题:1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法: 最简单的方式: docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World: docker…...
使用 Netty 实现 RPC 通信框架
使用 Netty 实现 RPC 通信框架 远程过程调用(RPC,Remote Procedure Call) 是分布式系统中非常重要的通信机制。它允许客户端调用远程服务器上的方法,就像调用本地方法一样。RPC 的核心在于屏蔽底层通信细节,使开发者关…...
【机器学习06--贝叶斯分类器】
文章目录 基础理解01 贝叶斯决策论02 极大似然估计03 朴素贝叶斯分类器04 半朴素贝叶斯分类器05 贝叶斯网06 EM算法 补充修正1. 贝叶斯定理与分类的基本概念2. 贝叶斯决策论3. 极大似然估计4. 朴素贝叶斯分类器5. 半朴素贝叶斯分类器6. 贝叶斯网7. EM算法 面试常考 基础理解 本…...

创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持续下去的动力! 目录 一. 简单汇总一下创建…...
[146 LRU缓存](https://leetcode.cn/problems/lru-cache/)
分析 维护一个双向链表保存缓存中的元素。 如果元素超过容量阈值,则删除最久未使用的元素。为了实现这个功能,将get(), put()方法获取的元素添加到链表首部。 为了在O(1)时间复杂度执行get()方法,再新建一个映射表,缓存key与链表…...

【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)
基于TCP的简单Netty自定义协议实现(万字,全篇例子) 前言 有一阵子没写博客了,最近在学习Netty写一个实时聊天软件,一个高性能异步事件驱动的网络应用框架,我们常用的SpringBoot一般基于Http协议࿰…...

【JavaWeb后端学习笔记】Redis常用命令以及Java客户端操作Redis
redis 1、redis安装与启动服务2、redis数据类型3、redis常用命令3.1 字符串String3.2 哈希Hash3.3 列表List3.4 集合Set(无序)3.5 有序集合zset3.6 通用命令 4、使用Java操作Redis4.1 环境准备4.2 Java操作字符串String4.3 Java操作哈希Hash4.4 Java操作…...

pdb调试器详解
文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…...

项目15:简易扫雷--- 《跟着小王学Python·新手》
项目15:简易扫雷 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程,适合各个层次的学习者。本教程从基础语法入手,逐步深入到高级应用,以实例驱动的方式,帮助学习者逐步掌握Python的…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...