回归算法模型之线性回归

news2025/6/3 7:22:07

哈喽!我是 我不是小upper~

今天来和大家聊聊「线性回归」—— 这是机器学习里最基础、最直观的算法之一,咱们用一个超简单的例子就能搞懂它!

先看一个生活场景

假设你是房产中介,遇到一个灵魂拷问:
客户有一套 110 平米的房子,到底能卖多少钱?

你手头有一批真实数据:

房子面积(平米)

价格(万)

80

100

100

120

120

140

150

170

这些数据看起来像什么?如果把它们画在纸上(横轴是面积,纵轴是价格),每个数据点会「大致排成一条斜线」,但又不完全重合(毕竟现实中房价还受地段、装修等因素影响)。

线性回归的核心目标:画一条「最聪明的线」

面对这些散落的数据点,线性回归要解决的问题是:
如何画出一条直线,让它尽可能靠近所有数据点?
这条线需要满足一个条件:让每个数据点到直线的垂直距离之和最小(简单来说,就是「整体误差最小」)。

举个直观的例子:

  • 如果画一条很陡的线,可能离 80 平米的点很近,但离 150 平米的点很远;

  • 如果画一条平缓的线,可能中间的点靠近了,但两端的点又偏离了。
    而线性回归会通过数学计算(比如最小二乘法),找到一条「平衡感最佳」的线,让这条线成为所有数据点的「最佳代言人」。

用这条线做预测

当这条「最佳直线」画好后,预测就变得超简单:

  • 客户问「110 平米的房子值多少钱?」

  • 你只需在直线上找到横轴为 110 的位置,看对应的纵轴数值是多少 —— 假设直线在这一点的高度是 130 万,就可以给出这个预测值。

因此,这就是线性回归。


原理详解

1. 建立模型假设:用直线搭建变量关系

我们先假设变量间存在「线性关系」,就像用一把直尺对齐散落的点。 单变量场景(如面积→房价): 用一条直线描述关系: \hat{y} = w \cdot x + b

  • \hat{y}:预测值(如房价)
  • x:输入特征(如面积)
  • w:斜率(每增加 1 平米,房价上涨的金额)
  • b:截距(面积为 0 时的 “虚拟基础价格”,实际无意义,但数学上需要)

多变量场景(如面积、卧室数→房价): 用向量表示更简洁:

\hat{y} = w_1x_1 + w_2x_2 + \dots + w_nx_n + b

 写成向量点积形式: \hat{y} = \boldsymbol{w}^T\boldsymbol{x} + b

  • \boldsymbol{w} = [w_1, w_2, \dots, w_n]^T:权重向量(每个特征的影响程度)
  • \boldsymbol{x} = [x_1, x_2, \dots, x_n]^T:特征向量

数学统一技巧: 为了简化推导,把截距 b 合并到权重向量中:

  • 令 \boldsymbol{x} = [x_1, x_2, \dots, x_n, 1]^T(新增一个恒为 1 的特征)
  • 令 \boldsymbol{w} = [w_1, w_2, \dots, w_n, b]^T(最后一个元素是截距) 则公式简化为:\hat{y} = \boldsymbol{w}^T\boldsymbol{x}

2. 目标函数:让预测误差尽可能小

我们有 m 条真实数据:\{(\boldsymbol{x}_1, y_1), (\boldsymbol{x}_2, y_2), \dots, (\boldsymbol{x}_m, y_m)\},希望预测值 \hat{y}_i 尽量接近真实值 y_i

用均方误差(MSE)度量总误差: J(\boldsymbol{w}) = \frac{1}{m} \sum_{i=1}^m \left(y_i - \hat{y}_i\right)^2 = \frac{1}{m} \sum_{i=1}^m \left(y_i - \boldsymbol{w}^T\boldsymbol{x}_i\right)^2

  • 为什么用平方? ① 放大误差(便于数学处理);② 避免正负误差抵消;③ 光滑函数,便于求导。
  • 目标:找到 \boldsymbol{w},使得 J(\boldsymbol{w}) 最小。

3. 解析解推导:用数学公式直接算出最优解

当数据量不大时,可以通过数学推导直接求出最优的 \boldsymbol{w},步骤如下:

1. 用矩阵表示数据

  • 特征矩阵 \boldsymbol{X}:形状为 m \times (n+1),每行是一个样本的特征向量(含新增的 1)。
  • 标签向量 \boldsymbol{y}:形状为 m \times 1,包含所有真实值。
  • 预测向量 \hat{\boldsymbol{y}} = \boldsymbol{X}\boldsymbol{w}(矩阵乘法本质是批量计算每个样本的 \hat{y}_i)。

2. 损失函数的矩阵形式 J(\boldsymbol{w}) = \frac{1}{m} (\boldsymbol{y} - \boldsymbol{X}\boldsymbol{w})^T(\boldsymbol{y} - \boldsymbol{X}\boldsymbol{w})

  • (\boldsymbol{y} - \boldsymbol{X}\boldsymbol{w}) 是预测误差向量,转置乘自身等于误差平方和。

3. 对 \boldsymbol{w} 求导并令导数为 0 \nabla_{\boldsymbol{w}} J(\boldsymbol{w}) = -\frac{2}{m} \boldsymbol{X}^T(\boldsymbol{y} - \boldsymbol{X}\boldsymbol{w}) 令导数为 0,解得:

\boldsymbol{w} = \left(\boldsymbol{X}^T\boldsymbol{X}\right)^{-1}\boldsymbol{X}^T\boldsymbol{y}

  • 前提:\boldsymbol{X}^T\boldsymbol{X} 可逆(即特征之间线性无关,无冗余)。
  • 优点:一步到位,无需迭代;缺点:矩阵求逆计算量大(尤其当特征数 n 很大时)。

4. 梯度下降:用迭代法逼近最优解

当数据量大或特征多(矩阵求逆困难)时,用梯度下降法逐步优化参数:

核心思想

  1. 随机初始化权重 \boldsymbol{w}(如全 0)。
  2. 计算当前参数下的损失函数梯度(即每个 w_j 对损失的影响方向)。
  3. 沿着梯度反方向更新参数(梯度方向是损失增加最快的方向,反方向即损失减少最快的方向)。
  4. 重复直到损失不再明显下降(收敛)。

数学步骤

  1. 计算梯度(对单变量场景,梯度是导数;对多变量,是偏导数向量): 

\nabla_{\boldsymbol{w}} J(\boldsymbol{w}) = \frac{2}{m} \boldsymbol{X}^T(\boldsymbol{X}\boldsymbol{w} - \boldsymbol{y})

  1. 更新参数: \boldsymbol{w} = \boldsymbol{w} - \alpha \cdot \nabla_{\boldsymbol{w}} J(\boldsymbol{w})

  • \alpha:学习率(步长),控制每次更新的幅度。
  • 直观理解:若预测值大于真实值,梯度为正,w 减少;反之,w 增加。

关键点

  • 学习率太小→收敛慢;太大→容易跳过最优解(震荡或发散)。
  • 可通过调整学习率、迭代次数或使用优化变种(如 Adam)提升效果。

总结对比

方法适用场景优点缺点
解析解小数据、低维特征一步到位,无迭代矩阵求逆计算量大
梯度下降大数据、高维特征可扩展性强,适合迭代需要调参,可能收敛慢

通过这两种方法,我们就能找到那条 “最聪明的线”,实现对未知数据的预测啦!


线性回归完整算法流程(从数据到模型的 6 大核心步骤)

步骤一:数据准备 —— 给模型喂 “学习材料”
  1. 收集数据: 每个样本包含两部分:

    • 特征(X):影响结果的因素(如房子的面积、房间数)。
    • 目标值(y):需要预测的结果(如房价)。 例如:(面积=100㎡, 房间数=3) → 房价=120万
  2. 数据预处理(标准化 / 归一化)

    • 原因:特征尺度差异大(如 “房产税” 可能是 400,“犯罪率” 可能是 0.1),模型会误判数值大的特征更重要。
    • 方法:用 StandardScaler 将特征转换为 均值为 0,标准差为 1(公式:x' = \frac{x - \mu}{\sigma}),让模型公平对待所有特征。
步骤二:构建模型 —— 用数学公式描述 “关系”

假设特征与目标值呈线性关系,模型公式为:

  • 单特征\hat{y} = w_1x_1 + bw_1 是特征权重,b 是截距)。
  • 多特征\hat{y} = w_1x_1 + w_2x_2 + \dots + w_nx_n + b,可写成矩阵形式:\hat{\boldsymbol{y}} = \boldsymbol{X}\boldsymbol{w} + b 其中 \boldsymbol{X} 是特征矩阵(每行一个样本),\boldsymbol{w} 是权重向量,b 是全局截距。
步骤三:定义损失函数 —— 告诉模型 “哪里错了”

用 均方误差(MSE) 衡量预测值 \hat{y}_i 与真实值 y_i 的差距:

J(\boldsymbol{w}, b) = \frac{1}{m} \sum_{i=1}^m (y_i - \hat{y}_i)^2 = \frac{1}{m} \sum_{i=1}^m (y_i - (\boldsymbol{w}^T\boldsymbol{x}_i + b))^2

  • 为什么用平方? ① 放大误差,便于数学优化;② 避免正负误差抵消;③ 函数光滑,方便求导。
步骤四:选择优化方法 —— 找到 “最优解” 的两条路
  1. 解析解(最小二乘法,适合小数据): 通过数学公式直接求解最优权重,公式:                                                            \boldsymbol{w} = (\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y}

    • 前提:特征矩阵 \boldsymbol{X} 满秩(无冗余特征)。
    • 优点:一步到位,无需迭代;缺点:数据量大时矩阵求逆计算慢。
  2. 梯度下降(适合大数据): 迭代优化权重,每次沿损失函数梯度的反方向更新(梯度是损失增长最快的方向,反方向即下降最快的方向):\boldsymbol{w} = \boldsymbol{w} - \alpha \cdot \nabla J(\boldsymbol{w})

    • \alpha 是学习率,控制每次更新的步长;
    • 重复迭代直到损失不再明显下降(收敛)。
步骤五:训练模型 —— 让模型 “学起来”
  1. 输入数据:将预处理后的特征和目标值分为训练集(80%)和测试集(20%)。
  2. 前向计算:用当前权重计算预测值 \hat{y} = \boldsymbol{X}\boldsymbol{w} + b
  3. 计算误差:用损失函数(如 MSE)衡量预测值与真实值的差距。
  4. 反向优化:根据优化方法(解析解 / 梯度下降)更新权重,重复直到误差最小。
步骤六:模型预测 —— 用 “学会的知识” 做判断

给定新样本的特征\boldsymbol{x}_{new},代入训练好的模型:\hat{y}_{new} = \boldsymbol{w}^T\boldsymbol{x}_{new} + b 得到预测值(如根据 110㎡、3 个房间,预测房价为 130 万)。


完整案例:用线性回归预测房价(代码逐行解析)

Step 1:模拟真实房价数据(带业务含义的特征)

假设我们拥有一组历史房屋交易数据,想根据房子的特征(比如面积、卧室数、地段评分等)预测它的售价。

咱们目标是使用线性回归模型预测房价,并进行可视化与模型优化。

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

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler

# Step 1: 构造模拟数据(仿真实际房价数据)
np.random.seed(42)
n_samples = 5006

# 模拟特征
X = pd.DataFrame({
    'CRIM': np.random.exponential(scale=5, size=n_samples),              # 犯罪率
    'ZN': np.random.uniform(0, 100, size=n_samples),                     # 住宅用地比例
    'INDUS': np.random.normal(10, 2, size=n_samples),                    # 工业用地比例
    'RM': np.random.normal(6, 0.5, size=n_samples),                      # 房间数
    'AGE': np.random.uniform(20, 100, size=n_samples),                   # 建造年代
    'TAX': np.random.normal(400, 50, size=n_samples),                    # 房产税
    'LSTAT': np.random.normal(12, 5, size=n_samples),                    # 低收入人口比例
})

# 模拟房价 y(带有一定线性关系 + 噪声)
y = 24 + 0.3*X['RM'] - 0.2*X['LSTAT'] - 0.01*X['CRIM'] + \
    0.05*X['ZN'] - 0.04*X['AGE'] + 0.01*X['TAX'] + 0.1*X['INDUS'] + \
    np.random.normal(0, 2, size=n_samples)

X['PRICE'] = y

# Step 2: 特征选择与划分训练集
features = ['CRIM', 'ZN', 'INDUS', 'RM', 'AGE', 'TAX', 'LSTAT']
X_data = X[features]
y_data = X['PRICE']

X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.2, random_state=0)

# Step 3: 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Step 4: 建立模型
model = LinearRegression()
model.fit(X_train_scaled, y_train)

# Step 5: 模型预测
y_pred = model.predict(X_test_scaled)

# Step 6: 模型评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("MSE:", mse)
print("R^2 Score:", r2)

# Step 7: 可视化:真实值 vs 预测值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, c='crimson', edgecolors='black', alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='limegreen', linewidth=2)
plt.title("Real vs Predicted Prices", fontsize=16)
plt.xlabel("Actual Prices", fontsize=14)
plt.ylabel("Predicted Prices", fontsize=14)
plt.grid(True)
plt.tight_layout()
plt.show()

# Step 8: 查看回归系数(特征影响)
coefficients = pd.Series(model.coef_, index=features)

plt.figure(figsize=(10, 6))
coefficients.sort_values().plot(kind='barh', color='royalblue', edgecolor='black')
plt.title("Feature Influence on Price", fontsize=16)
plt.xlabel("Coefficient Value", fontsize=14)
plt.grid(True)
plt.tight_layout()
plt.show()

# Step 9: 模型优化 - 使用岭回归与Lasso
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)
ridge_pred = ridge.predict(X_test_scaled)

lasso = Lasso(alpha=0.1)
lasso.fit(X_train_scaled, y_train)
lasso_pred = lasso.predict(X_test_scaled)

print("Ridge R^2:", r2_score(y_test, ridge_pred))
print("Lasso R^2:", r2_score(y_test, lasso_pred))
Step 1:模拟真实房价数据(带业务含义的特征)
# 模拟7个特征(犯罪率、房间数等)和房价,加入随机噪声模拟真实场景
np.random.seed(42)  # 固定随机种子,确保结果可复现
n_samples = 5006
X = pd.DataFrame({
    'CRIM': np.random.exponential(scale=5, size=n_samples),    # 犯罪率(数值越高,房价可能越低)
    'RM': np.random.normal(6, 0.5, size=n_samples),             # 房间数(数值越高,房价可能越高)
    # 其他特征类似...
})
# 房价公式:真实关系 + 随机噪声(模拟现实中的不确定性)
y = 24 + 0.3*X['RM'] - 0.2*X['LSTAT'] + ... + np.random.normal(0, 2, size=n_samples)
Step 2:划分训练集与测试集(8:2 比例)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X_data, y_data, test_size=0.2, random_state=0
)

目的:用测试集评估模型在 “没见过的数据” 上的表现,避免过度拟合训练数据。

Step 3:数据标准化(让特征 “公平竞争”)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)  # 用训练集的均值/标准差转换数据
X_test_scaled = scaler.transform(X_test)        # 测试集用训练集的统计量转换(避免数据泄漏)

为什么必须先 fit 训练集? 测试集不能接触训练集的信息,否则评估结果不真实。

Step 4:训练线性回归模型(核心代码 2 行)
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train_scaled, y_train)  # 自动求解最优权重w和截距b

fit() 内部做了什么? 对多特征数据,默认使用高效的矩阵运算求解解析解(或梯度下降,取决于数据规模)。

Step 5-6:预测与评估(量化模型好坏)
y_pred = model.predict(X_test_scaled)  # 用测试集特征预测房价

MSE(均方误差):\(\text{MSE} = \frac{1}{m} \sum_{i=1}^m (y_i - \hat{y}_i)^2\) 数值越小,预测越准。

R²(判定系数)R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}R^2=1:完美预测;R^2=0:仅能预测平均值。

Step 7:可视化 —— 直观判断预测效果
plt.scatter(y_test, y_pred)  # 真实值vs预测值散点图
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='limegreen')

理想情况:点分布在绿色对角线上,说明预测值与真实值一致。

Step 8:特征影响分析(系数可视化)
coefficients = pd.Series(model.coef_, index=features)
coefficients.sort_values().plot(kind='barh')

正系数(如 RM 房间数):特征值越大,房价越高;

负系数(如 LSTAT 低收入比例):特征值越大,房价越低;

系数绝对值越大,特征对房价的影响越强。

Step 9:模型优化(应对过拟合,提升泛化能力)
from sklearn.linear_model import Ridge, Lasso
ridge = Ridge(alpha=1.0)  # 岭回归,惩罚系数绝对值过大
lasso = Lasso(alpha=0.1)  # Lasso回归,强制不重要特征的系数为0(特征选择)

过拟合场景:训练集表现好,测试集表现差(模型记住了噪声)。

  • 正则化作用
    • Ridge:防止系数过大,增强模型稳定性;
    • Lasso:自动剔除无关特征(系数为 0 的特征可忽略)。

总结:线性回归的 “全链路思维”

  1. 数据是基础:特征质量直接影响模型效果(如 “房间数” 比 “小区名称” 更易量化)。
  2. 模型是桥梁:用线性公式假设特征与目标的关系,数学上可推导、可解释。
  3. 优化是关键:根据数据规模选择解析解或梯度下降,用正则化防止过拟合。
  4. 评估是验证:通过测试集和可视化,确保模型不仅 “学过”,还能 “举一反三”。

通过这套流程,线性回归能快速落地到房价预测、销量预估等实际场景,是理解机器学习的最佳入门案例~

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

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

相关文章

【深度学习】10. 深度推理(含链式法则详解)RNN, LSTM, GRU,VQA

深度推理(含链式法则详解)RNN, LSTM, GRU,VQA RNN 输入表示方式 在循环神经网络(Recurrent Neural Network, RNN)中,我们处理的是一段文字或语音等序列数据。对于文本任务,输入通常是单词序列…

【Qt】Bug:findChildren找不到控件

使用正确的父对象调用 findChildren:不要在布局对象上调用 findChildren,而应该在布局所在的窗口或控件上调用。

【linux】linux进程概念(四)(环境变量)超详细版

小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 linux系列专栏<—请点击 倘若命中无此运&#xff0c;孤身亦可登昆仑&#xff0c;送给屏幕面前的读者朋友们和小编自己! 目录 前言一、基本概念二、认识常见的几个环境变量echo $ 查看某个环境变量env 显示…

从零开始的二三维CAD|CAE软件: 解决VTK,DICOM体素化-失效问题.

背景: 在从零开始的二三维软件开发中, 需要加载CT的dicoms影像文件, 并将其序列化之后的数据,体素化 可惜..vtk的c#库,将其体素化的时候,竟然失败... 使用vtkDicomReader ,设置 Dicom文件夹读取,竟然不停的失败...从网上找了一些版本.也没啥可用的资料... 解决办法: 直接…

【计算机网络】应用层协议Http——构建Http服务服务器

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;计算机网络 &#x1f339;往期回顾&#x1f339;&#xff1a; 【Linux笔记】——进程间关系与守护进程 &#x1f516;流水不争&#xff0c;争的是滔滔不息 一、Http协…

linux版本vmware修改ubuntu虚拟机为桥接模式

1、先打开linux版本vmware操作界面 2、设置虚拟路由编辑器的桥接模式 输入账号密码 自动模式 不需要进行任何操作 3、修改虚拟机设置网络模式为桥接模式 然后save保存一下配置 4、现在进入虚拟机查看ens33配置 网卡启动但是没有ip 5、自己进行设置修改ubuntu网络配置文件 cd …

从0到1上手Trae:开启AI编程新时代

摘要&#xff1a;字节跳动 2025 年 1 月 19 日发布的 Trae 是一款 AI 原生集成开发环境工具&#xff0c;3 月 3 日国内版推出。它具备 AI 问答、代码自动补全、基于 Agent 编程等功能&#xff0c;能自动化开发任务&#xff0c;实现端到端开发。核心功能包括智能代码生成与补全、…

Linux之MySQL安装篇

1.确保Yum环境是否能正常使用 使用yum环境进行软件的安装 yum -y install mysql-server mysql2.确保软件包已正常完成安装 3.设置防火墙和selinux配置 ## 关闭防火墙 systemctl stop firewalld## 修该selinux配置 vim /etc/selinux/config 将seliuxenforcing修改为sel…

Asp.Net Core 如何配置在Swagger中带JWT报文头

文章目录 前言一、配置方法二、使用1、运行应用程序并导航到 /swagger2、点击右上角的 Authorize 按钮。3、输入 JWT 令牌&#xff0c;格式为 Bearer your_jwt_token。4、后续请求将自动携带 Authorization 头。 三、注意事项总结 前言 配置Swagger支持JWT 一、配置方法 在 …

第12讲、Odoo 18 权限控制机制详解

目录 引言权限机制概述权限组&#xff08;Groups&#xff09;访问控制列表&#xff08;ACL&#xff09;记录规则&#xff08;Record Rules&#xff09;字段级权限控制按钮级权限控制菜单级权限控制综合案例&#xff1a;多层级权限控制最佳实践与注意事项总结 引言 Odoo 18 提…

8086 处理器 Flags 标志位全解析:CPU 的 “晴雨表” 与 “遥控器”总结:

引入&#xff1a; 你是否好奇&#xff0c;当 CPU 执行一条加法指令时&#xff0c;如何自动判断结果是否超出范围&#xff1f;当程序跳转时&#xff0c;如何快速决定走哪条分支&#xff1f;甚至在调试程序时&#xff0c;为何能让 CPU “一步一停”&#xff1f;这一切的答案&…

具有离散序列建模的统一多模态大语言模型【AnyGPT】

第1章 Instruction 在人工智能领域、多模态只语言模型的发展正迎来新的篇章。传统的大型语言模型(LLM)在理解和生成人类语言方面展现出了卓越的能力&#xff0c;但这些能力通常局限于 文本处理。然而&#xff0c;现实世界是一个本质上多模态的环境&#xff0c;生物体通过视觉、…

物流项目第九期(MongoDB的应用之作业范围)

本项目专栏&#xff1a; 物流项目_Auc23的博客-CSDN博客 建议先看这期&#xff1a; MongoDB入门之Java的使用-CSDN博客 需求分析 在项目中&#xff0c;会有两个作业范围&#xff0c;分别是机构作业范围和快递员作业范围&#xff0c;这两个作业范围的逻辑是一致的&#xf…

系统思考:经营决策沙盘

今年是我为黄浦区某国有油漆涂料企业提供经营决策沙盘培训的第二年。在这段时间里&#xff0c;我越来越感受到&#xff0c;企业的最大成本往往不在生产环节&#xff0c;而是在决策错误上所带来的长远影响。尤其是在如今这个复杂多变的环境下&#xff0c;企业面临的挑战愈发严峻…

[网页五子棋][对战模块]实现游戏房间页面,服务器开发(创建落子请求/响应对象)

实现游戏房间页面 创建 css/game_room.css #screen 用于显示当前的状态&#xff0c;例如“等待玩家连接中…”&#xff0c;“轮到你落子”&#xff0c;“轮到对方落子”等 #screen { width: 450px; height: 50px; margin-top: 10px; color: #8f4e19; font-size: 28px; …

Centos环境下安装/重装MySQL完整教程

目录 一、卸载残留的MySQL环境&#xff1a; 二、安装MySQL&#xff1a; 1、下载MySQL官方的yum源&#xff1a; 2、更新系统yum源&#xff1a; 3、确保系统中有了对应的MySQL安装包&#xff1a; 4、安装MySQL服务&#xff1a; 5、密钥问题安装失败解决方法&#xff1a; …

【Linux】环境变量完全解析

9.环境变量 文章目录 9.环境变量一、命令行参数二、获取环境变量程序中获取环境变量1. 使用命令行参数2. 使用系统调用函数getenv("字符串");3. 使用系统提供的全局变量environ 命令行中查询环境变量 三、常见环境变量1. HOME2. OLDPWD3. PATH4. SHELL 四、环境变量与…

力扣每日一题——找到离给定两个节点最近的节点

目录 题目链接&#xff1a;2359. 找到离给定两个节点最近的节点 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;双指针路径交汇法​ 基本思路 关键步骤 为什么这样可行呢我请问了&#xff1f; 举个例子 特殊情况 Java写法&#xff1a; C写法&a…

卷积神经网络(CNN)入门学习笔记

什么是 CNN&#xff1f; CNN&#xff0c;全称 卷积神经网络&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一种专门用来处理图片、语音、文本等结构化数据的神经网络。 它模仿人眼识别图像的方式&#xff1a; 从局部到整体&#xff0c;一步步提取特征&a…

VLAN的作用和原理

1. 为什么要有vlan&#xff1f; 分割广播域&#xff0c;避免广播风暴&#xff0c;造成网络资源的浪费 可以灵活的组网&#xff0c;便于管理&#xff0c;同时还有安全加固的功能 2. vlan是怎么实现的&#xff1f;端口的原理&#xff1f; 设置VLAN后&#xff0c;流量之间的转…