机器学习27:使用 Pandas 和 TensorFlow 进行数据建模编程实践

news2024/11/27 12:30:41

本文将详细介绍基于 Pandas 和 TensorFlow 探索、清理以及转换用于训练模型的数据集的方法,辅以代码和图片。

学习目标:

  • 了解使用 Pandas 进行数据清理和处理丢失数据的基础知识。
  • 使用校准图评估模型性能。
  • 使用各种特征转换训练模型。
  • 使用可视化来了解特征转换的价值。

关于环境搭建,请前往《机器学习6:使用 TensorFlow 的训练线性回归模型》,本文不再赘述。

目录

1.准备工作

1.1 导入依赖模块

1.2 Pandas 基本设置

1.3 用 Pandas 加载数据集

2.任务一:使用 Pandas 探索和准备数据

2.1 探索数据

2.2 准备数据

3. 任务二:基于数字特征(未规范化-Normalization)训练模型

3.1 基于数字特征训练模型

3.2 将模型的预测可视化

3.3 完整代码运行

4.任务三:基于数值特征训练模型(需规范化-Normalization)模型

4.1 特征规范化

4.2 预测结果可视化

5.任务四:基于类别特征来训练模型

6.参考文献


1.准备工作

1.1 导入依赖模块

import numpy as np
import pandas as pd
import math
from matplotlib import pyplot as plt
import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

1.2 Pandas 基本设置

Pandas 是一个有用的内存数据集数据分析库。基于 Pandas 的工具包,我们可以读取数据、探索数据并进行一些基本处理。它对适合内存存储的数据集非常有帮助!首先,我们设置一些选项来控制项目的显示方式以及显示表时要显示的最大行数——注意:可以根据需要更改此设置。

# 基础设置:展示样式和最大行数
pd.options.display.float_format = '{:.2f}'.format
pd.options.display.max_rows = 15

1.3 用 Pandas 加载数据集

数据原始来源:https://storage.googleapis.com/mledu-datasets/cars_data.csv,这个数据集是关于汽车的数据。在本文中,我们将基于该数据集训练模型来预测汽车价格。

为了便于在本地执行,需要读者先将数据下载到本地——笔者存储该数据集的本地文件路径为:/Users/jinKwok/Downloads/cars_data.csv。

需要说明的是,汽车数据集中的字段是以逗号分隔的,没有标题行。为了让每一列都有一个有意义的标题,我们必须进行一些处理——即从汽车数据集中获取有关列的信息,然后据此设置标题。

# 由于数据集的列没有标题,因此,我们需要根据数据的实际语义为每一列设置一个标题
feature_names = ['symboling', 'normalized-losses', 'make', 'fuel-type',
                 'aspiration', 'num-doors', 'body-style', 'drive-wheels',
                 'engine-location', 'wheel-base', 'length', 'width', 'height', 'weight',
                 'engine-type', 'num-cylinders', 'engine-size', 'fuel-system', 'bore',
                 'stroke', 'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg',
                 'highway-mpg', 'price']

# 使用 pandas 从本地路径加载数据到内存中
car_data = pd.read_csv('/Users/jinKwok/Downloads/cars_data.csv',
                       sep=',', names=feature_names, header=None, encoding='latin-1')

# 将数据随机化,确保梯度下降的性能
car_data = car_data.reindex(np.random.permutation(car_data.index))

print("Data set loaded. Num examples: ", len(car_data))


2.任务一:使用 Pandas 探索和准备数据

Pandas 的 DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引。Pandas Series 类似表格中的一个列(column),类似一维数组,可以保存任何数据类型。Series 由索引(index)和列组成。关于 Pandas,本文不展开介绍。

2.1 探索数据

本节中将使用 Pandas 检查数据,并定义 numeric_feature_name 和 categorical_feature_name 的特征列表。此外,还可以执行以下操作:

  • dataframe[4:7]:拉出 Pandas 数据帧中的第 4、5、6 行;
  • dataframe[['mycol1','mycol2']] 将取出名为 mycol1 和 mycol2 的两列,并生成一个新的 Pandas DataFrame 对象;
  • dataframe['mycol1'] 将取出名为 mycol1 的列,并生成一个 Pandas Series 对象,而不是DataFrame;
  • dataframe.describe():打印每个 DataFrame 的统计信息;
# 使用Pandas 拉出 car_data的第5~7行
car_data[4:7]

# 定义标签和两组特征:1.数字特征-numeric_feature_names;2.类别特征-categorical_feature_names
LABEL = 'price'
numeric_feature_names = ['symboling', 'normalized-losses', 'wheel-base',
                         'length', 'width', 'height', 'weight', 'engine-size', 'horsepower',
                         'peak-rpm', 'city-mpg', 'highway-mpg', 'bore', 'stroke',
                         'compression-ratio']
categorical_feature_names = list(set(feature_names) - set(numeric_feature_names) - set([LABEL]))
# 通过断言,确认两组特征的数量是否符合预期
assert len(numeric_feature_names) == 15
assert len(categorical_feature_names) == 10

# 运行以检查数字特征。
car_data[numeric_feature_names]

# 运行以检查类别特征。
car_data[categorical_feature_names]

需要特别说明的是,如果在 PyCharm 中直接执行包含上述代码的 .py 文件,是无法直接观察到数据的,因为数据并不会直接打印出来。你可以采用类似 print(car_data[4:7]) 打印 DataFrame,也可以通过 Python Console 来运行代码,从而查看数据,如下所示:

>>> car_data[4:7]
     symboling normalized-losses    make  ... city-mpg highway-mpg  price
145          0               102  subaru  ...       24          29  11259
60           0               115   mazda  ...       26          32   8495
32           1               101   honda  ...       38          42   5399
[3 rows x 26 columns]

类似的,在 Python Console 执行:car_data[numeric_feature_names] 和 car_data[categorical_feature_names],可以分别查看我们定义的数字特征和类别特征,如下所示:

>>> car_data[numeric_feature_names]
     symboling normalized-losses  wheel-base  ...  bore  stroke  compression-ratio
57           3               150       95.30  ...     ?       ?               9.40
148          0                85       96.90  ...  3.62    2.64               9.00
56           3               150       95.30  ...     ?       ?               9.40
189          3                 ?       94.50  ...  3.19    3.40               8.50
145          0               102       97.00  ...  3.62    2.64               7.70
..         ...               ...         ...  ...   ...     ...                ...
26           1               148       93.70  ...  2.97    3.23               9.40
169          2               134       98.40  ...  3.62    3.50               9.30
50           1               104       93.10  ...  3.03    3.15               9.00
80           3               153       96.30  ...  3.17    3.46               7.50
8            1               158      105.80  ...  3.13    3.40               8.30

此外,通过 Python Console 也可以直接将 DataFrame 可视化,如下图所示:点击“View as DataFrame”,即可将 DataFrame 可视化为表格形式。

2.2 数据转换

模型无法给予非数值类型的数据训练模型,因此,对于原始数据中的非数值类型,我们需要进行强制转换。此外,原始数据中,列纬度可能是缺失的,对于这些缺失的数据,需要进行人工填充,如下代码所示:

# 遍历,将上面定义的数字特征(numeric_feature_names)强制转换为数字。这是必要的,因为模型无法处理非数字型特征。
# 如果非数字型特征直接输入,模型会崩溃
for feature_name in numeric_feature_names + [LABEL]:
    car_data[feature_name] = pd.to_numeric(car_data[feature_name], errors='coerce')

# 对于缺省的数据,用0填充
# 注意:这种处理方式并非是最好的,后面我们将尝试其他方法
car_data.fillna(0, inplace=True)


3. 任务二:基于数字特征(未规范化-Normalization)训练模型

在本节,我们利用任务一中定义的数字特征组(numeric_feature_names)作为输入特征,来训练汽车价格预测模型。我们可以修改以下超参数尝试降低损失:

  • 学习率:
  • 优化器;
  • 隐藏层维度——需考虑训练示例的数量,确保选择是有意义的
  • 批大小
  • 训练步骤数量

3.1 基于数字特征训练模型

# 设置训练模型需要的配置:批大小-batch_size,数字特征-numeric_feature_names,预测标签-price
# 改变其他参数可以提高模型的质量,但要谨慎对待,因为数据集非常小
batch_size = 16
x_df = car_data[numeric_feature_names]
y_series = car_data['price']

train_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    y=y_series,
    batch_size=batch_size,
    num_epochs=None,
    shuffle=True)

eval_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    y=y_series,
    batch_size=batch_size,
    shuffle=False)

predict_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    batch_size=batch_size,
    shuffle=False)

# 对于特征列(上面定义的数值特征组 numeric_feature_names 中的列),允许模型解析数据,执行公共预处理,并自动生成 tf.Estimator 的输入层
model_feature_columns = [
    tf.feature_column.numeric_column(feature_name) for feature_name in numeric_feature_names
]
print('model_feature_columns', model_feature_columns)

est = tf.estimator.DNNRegressor(
    feature_columns=model_feature_columns,
    hidden_units=[64],
    optimizer=tf.train.AdagradOptimizer(learning_rate=0.01),
)

# 训练模型
num_print_statements = 10
num_training_steps = 10000
for _ in range(num_print_statements):
    est.train(train_input_fn, steps=num_training_steps // num_print_statements)
    scores = est.evaluate(eval_input_fn)
    # “分数”字典有几个由估计器自动生成的度量指标
    # 1-`average_loss’是单个示例的平均损失
    # 2-`loss`是批次的总损失
    print('scores', scores)

输出信息如下:显然,这很不直观。

scores {'average_loss': 37720610.0, 'label/mean': 12949.43, 'loss': 594824960.0, 'prediction/mean': 13431.765, 'global_step': 1000}
scores {'average_loss': 29733780.0, 'label/mean': 12949.43, 'loss': 468878850.0, 'prediction/mean': 13133.609, 'global_step': 2000}
scores {'average_loss': 26735054.0, 'label/mean': 12949.43, 'loss': 421591230.0, 'prediction/mean': 13078.116, 'global_step': 3000}
scores {'average_loss': 25478890.0, 'label/mean': 12949.43, 'loss': 401782500.0, 'prediction/mean': 13164.152, 'global_step': 4000}
scores {'average_loss': 24855248.0, 'label/mean': 12949.43, 'loss': 391948130.0, 'prediction/mean': 13136.9795, 'global_step': 5000}
scores {'average_loss': 24471574.0, 'label/mean': 12949.43, 'loss': 385897920.0, 'prediction/mean': 13141.731, 'global_step': 6000}
scores {'average_loss': 24200630.0, 'label/mean': 12949.43, 'loss': 381625300.0, 'prediction/mean': 13081.306, 'global_step': 7000}
scores {'average_loss': 23986446.0, 'label/mean': 12949.43, 'loss': 378247800.0, 'prediction/mean': 13127.951, 'global_step': 8000}
scores {'average_loss': 23794016.0, 'label/mean': 12949.43, 'loss': 375213340.0, 'prediction/mean': 13052.78, 'global_step': 9000}
scores {'average_loss': 23594436.0, 'label/mean': 12949.43, 'loss': 372066100.0, 'prediction/mean': 13173.646, 'global_step': 10000}

3.2 预测结果可视化

模型训练完成之后,我们需要了解模型的推断与实际数据的差异——即观察模型的预测效果。当然,最好的方式是将预测效果可视化。

关于可视化,我们可以基于辅助函数 scatter_plot_inference 来实现。注意:实际数据为灰色。你的模型的预测是橙色的。

# 可视化模型预测结果
def scatter_plot_inference_grid(est, x_df, feature_names):
    """打印预测结果.
    Args:
      est:经过训练的tf估计器
      x_df: 输入特征,即 pandas dataframe 对象
      feature_names: 要绘制的特征名称组
    """

    def scatter_plot_inference(axis,
                               x_axis_feature_name,
                               y_axis_feature_name,
                               predictions):
        """生成一个子图区域."""
        # 用灰色打印真实数据.
        y_axis_feature_name = 'price'
        axis.set_ylabel(y_axis_feature_name)
        axis.set_xlabel(x_axis_feature_name)
        axis.scatter(car_data[x_axis_feature_name],
                     car_data[y_axis_feature_name],
                     c='grey')

        # 用橙色打印预测数据.
        axis.scatter(car_data[x_axis_feature_name], predictions, c='orange')

    predict_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=x_df,
        batch_size=batch_size,
        shuffle=False)

    predictions = [
        x['predictions'][0]
        for x in est.predict(predict_input_fn)
    ]

    num_cols = 3
    num_rows = int(math.ceil(len(feature_names) / float(num_cols)))
    f, axarr = plt.subplots(num_rows, num_cols)
    size = 4.5
    f.set_size_inches(num_cols * size, num_rows * size)

    for i, feature_name in enumerate(numeric_feature_names):
        axis = axarr[int(i / num_cols), i % num_cols]
        scatter_plot_inference(axis, feature_name, 'price', predictions)
    plt.show()


# 调用打印函数,将预测结果可视化
scatter_plot_inference_grid(est, x_df, numeric_feature_names)

3.3 完整代码运行

import numpy as np
import pandas as pd
import math
from matplotlib import pyplot as plt
import tensorflow.compat.v1 as tf

tf.disable_v2_behavior()

# 设置展示样式和最大行数
pd.options.display.float_format = '{:.2f}'.format
pd.options.display.max_rows = 15

# 由于数据集的列没有标题,因此,我们需要根据数据的实际语义为每一列设置一个标题
feature_names = ['symboling', 'normalized-losses', 'make', 'fuel-type',
                 'aspiration', 'num-doors', 'body-style', 'drive-wheels',
                 'engine-location', 'wheel-base', 'length', 'width', 'height', 'weight',
                 'engine-type', 'num-cylinders', 'engine-size', 'fuel-system', 'bore',
                 'stroke', 'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg',
                 'highway-mpg', 'price']

# 使用 pandas 从本地路径加载数据
car_data = pd.read_csv('/Users/shulan/Downloads/cars_data.csv',
                       sep=',', names=feature_names, header=None, encoding='latin-1')

# 将数据随机化,确保梯度下降的性能
car_data = car_data.reindex(np.random.permutation(car_data.index))

print("Data set loaded. Num examples: ", len(car_data))

# 定义标签和两组特征:1.数字特征-numeric_feature_names;2.类别特征-categorical_feature_names
LABEL = 'price'
numeric_feature_names = ['symboling', 'normalized-losses', 'wheel-base',
                         'length', 'width', 'height', 'weight', 'engine-size', 'horsepower',
                         'peak-rpm', 'city-mpg', 'highway-mpg', 'bore', 'stroke',
                         'compression-ratio']
categorical_feature_names = list(set(feature_names) - set(numeric_feature_names) - set([LABEL]))
# 通过断言,确认两组特征的数量是否符合预期
assert len(numeric_feature_names) == 15
assert len(categorical_feature_names) == 10

# 遍历,将上面定义的数字特征(numeric_feature_names)强制转换为数字。这是必要的,因为模型无法处理非数字型特征。
# 如果非数字型特征直接输入,模型会崩溃
for feature_name in numeric_feature_names + [LABEL]:
    car_data[feature_name] = pd.to_numeric(car_data[feature_name], errors='coerce')

# 对于缺省的数据,用0填充
# 注意:这种处理方式并非是最好的,后面我们将尝试其他方法
car_data.fillna(0, inplace=True)

# 设置训练模型需要的配置:批大小-batch_size,数字特征-numeric_feature_names,预测标签-price
# 改变其他参数可以提高模型的质量,但要谨慎对待,因为数据集非常小
batch_size = 16
x_df = car_data[numeric_feature_names]
y_series = car_data['price']

train_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    y=y_series,
    batch_size=batch_size,
    num_epochs=None,
    shuffle=True)

eval_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    y=y_series,
    batch_size=batch_size,
    shuffle=False)

predict_input_fn = tf.estimator.inputs.pandas_input_fn(
    x=x_df,
    batch_size=batch_size,
    shuffle=False)

# 对于特征列(上面定义的数值特征组 numeric_feature_names 中的列),允许模型解析数据,执行公共预处理,并自动生成 tf.Estimator 的输入层
model_feature_columns = [
    tf.feature_column.numeric_column(feature_name) for feature_name in numeric_feature_names
]
print('model_feature_columns', model_feature_columns)

est = tf.estimator.DNNRegressor(
    feature_columns=model_feature_columns,
    hidden_units=[64],
    optimizer=tf.train.AdagradOptimizer(learning_rate=0.01),
)

# 训练模型
num_print_statements = 10
num_training_steps = 10000
for _ in range(num_print_statements):
    est.train(train_input_fn, steps=num_training_steps // num_print_statements)
    scores = est.evaluate(eval_input_fn)
    # “分数”字典有几个由估计器自动生成的度量指标
    # 1-`average_loss’是单个示例的平均损失
    # 2-`loss`是批次的总损失
    print('scores', scores)


# 可视化模型预测结果
def scatter_plot_inference_grid(est, x_df, feature_names):
    """打印预测结果.
    Args:
      est:经过训练的tf估计器
      x_df: 输入特征,即 pandas dataframe 对象
      feature_names: 要绘制的特征名称组
    """

    def scatter_plot_inference(axis,
                               x_axis_feature_name,
                               y_axis_feature_name,
                               predictions):
        """生成一个子图区域."""
        # 用灰色打印真实数据.
        y_axis_feature_name = 'price'
        axis.set_ylabel(y_axis_feature_name)
        axis.set_xlabel(x_axis_feature_name)
        axis.scatter(car_data[x_axis_feature_name],
                     car_data[y_axis_feature_name],
                     c='grey')

        # 用橙色打印预测数据.
        axis.scatter(car_data[x_axis_feature_name], predictions, c='orange')

    predict_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=x_df,
        batch_size=batch_size,
        shuffle=False)

    predictions = [
        x['predictions'][0]
        for x in est.predict(predict_input_fn)
    ]

    num_cols = 3
    num_rows = int(math.ceil(len(feature_names) / float(num_cols)))
    f, axarr = plt.subplots(num_rows, num_cols)
    size = 4.5
    f.set_size_inches(num_cols * size, num_rows * size)

    for i, feature_name in enumerate(numeric_feature_names):
        axis = axarr[int(i / num_cols), i % num_cols]
        scatter_plot_inference(axis, feature_name, 'price', predictions)
    plt.show()


# 调用打印函数,将预测结果可视化
scatter_plot_inference_grid(est, x_df, numeric_feature_names)

运行结果——可视化预测结果(灰色为真实值,橙色为预测值)如下图所示:

 

4.任务三:基于数值特征训练模型(需规范化-Normalization)模型

4.1 特征规范化

更进一步,对任务二中的数值特征进行规范化处理,而后再用来训练模型。关于规范化处理方法,在《机器学习26:《数据准备和特征工程-IV》数据转换》中有详细的介绍。由于本案例中的数值特征并不包含极端异常值,因此可采用 “Z 分数” 法来进行规范化。代码如下:

# 使用 Z 分数对输入数值特征进行规范化
# Epsilon:防止除数为零
epsilon = 0.000001
model_feature_columns = [
    tf.feature_column.numeric_column(feature_name,
                                     normalizer_fn=lambda val: (val - x_df.mean()[feature_name]) / (
                                                 epsilon + x_df.std()[feature_name]))
    for feature_name in numeric_feature_names
]
print('model_feature_columns', model_feature_columns)

其中,用到了 pandas 的功能很有:

  • dataframe.mmean()['your_feature_name']:获取特征“your_feature_name”的平均值;
  • dataframe.std()['your_feature_name']:获取特征“your_feature_name”的标准差。

4.2 预测结果可视化

用 4.1 中的代码,替换掉 3.3 中的的相关代码,然后运行,可以得到如下结果。

 

5.任务四:基于类别特征来训练模型

与基于特征组 numeric_feature_names 训练模型类似,采用类别特征组 categorical_feature_names 训练模型,本质差异只是采用的输入特征不同。基于上面的代码,修改输入特征即可。这里不再演示了。

6.参考文献

链接-https://developers.google.cn/machine-learning/data-prep/programming-exercise

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

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

相关文章

前端学习——jsDay5

对象 对象使用 小练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"width…

科技力量赋予 SK5 代理 HTTP 代理 IP 网络无限可能

第一部分&#xff1a;智能网络加速技术 智能缓存&#xff1a;SK5 代理 HTTP 代理 IP 利用智能缓存技术&#xff0c;将经常访问的资源缓存在代理服务器中&#xff0c;从而实现更快速的资源加载和页面响应。这种智能化的缓存策略有效减少了对远程服务器的依赖&#xff0c;提升了用…

产品经理学习画原型-登录界面

开始画登录界面 选择一个矩形 常用修改&#xff1a; 选择文本标签&#xff1a; 设置字体、字号、颜色 添加水平线&#xff1a; 调整两个线连接&#xff0c;可以用CTRL加号、减号放大缩小画布来处理 选择一个主要按钮&#xff1a; 处理颜色、圆角 添加文本框&#xff1a; 设置高…

Android性能分析【启动优化】

作者&#xff1a;申国骏 性能分析工具 首先我们来学习一下如何使用性能分析的工具。我们从一个具体的例子出发&#xff0c;就是如何分析应用启动的性能。 Android Profiler 配置 我们来先看看Android Profiler。为了能在应用一启动就能马上捕捉到分析数据&#xff0c;我们需…

python接口自动化(十八)--重定向(Location)(详解)

简介 在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&#…

Linux下make和makefile的使用方法

1.make和makefile的区别 make是指令&#xff0c;makefile是文件&#xff0c;这是两者的却别。两者搭配使用&#xff0c;完成项目自动化创建。 2.make原理 make是如何工作的&#xff0c;也就是在默认情况下&#xff0c;我们只输入make命令&#xff0c;那么 1.make会在当前目录下…

Python基础:函数和函数式编程

文章目录 函数和函数式编程函数函数式编程 函数和函数式编程 函数 声明函数&#xff1a; def hello():print("hello function!")调用函数&#xff1a; # 使用()调用 hello()#output:hello function!# 没有()&#xff0c;则不进行调用&#xff0c;一切皆是对象&am…

Spring + Spring MVC + MyBatis+Bootstrap+Mysql酒店管理系统源码

IDEASpring Spring MVC MyBatisBootstrapMysql酒店管理系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.会员信息管理3.客房信息类型管理4.客房信息管理5.客房信息添加6.预定信息管理7.入住信息管理8.入住信息添加 三、部分代码UserMapper.javaUserController.j…

MySQl数据库第四课-------------努力------努力------努力

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————————— 目录 sudo whoami who exit reboot、shutdown 软件安装 编辑器vim ————————————————————————…

9.2.2 【Linux】按键说明

第一部份&#xff1a;一般指令模式可用的按钮说明&#xff0c;光标移动、复制贴上、搜寻取代等 第二部份&#xff1a;一般指令模式切换到编辑模式的可用的按钮说明 第三部份&#xff1a;一般指令模式切换到命令行界面的可用按钮说明

公网远程连接Redis数据库「内网穿透」

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转载自cpolar极点云文章&#xff1a;公网远程连接Red…

Python_列表比较大小

比较原理 从第一个元素顺序开始比较&#xff0c;如果相等&#xff0c;则继续&#xff0c;返回第一个不相等元素得比较结果。如果所有元素比较均相等&#xff0c;则长的列表大&#xff0c;一样长则两列表相等。 示例 a [5, 6, 3] b [5, 4, 3, 1] # 返回第1个不相等同位元素…

计算机图形硬件(二) 5 - 3 图形工作站和观察系统、输入设备

1 图形工作站和观察系统 目前&#xff0c;大多数图形监视器以光栅扫描显示的方式工作&#xff0c;一般使用 CRT或平板系统。图形系统的范围从小型通用计算机系统到多监视器及超大幅面观察屏幕。个人计算机的屏幕分辨率从640x480到1280x1024屏幕对角线从12英寸到21英寸。多数通…

基于STM32的300W无刷直流电机驱动方案

如何驱动无刷电机&#xff1f; 近些年&#xff0c;由于无刷直流电机大规模的研发和技术的逐渐成熟&#xff0c;已逐步成为工业用电机的发展主流。围绕降低生产成本和提高运行效率&#xff0c;各大厂商也提供不同型号的电机以满足不同驱动系统的需求。现阶段已经在纺织、冶金、…

【macOS 系列】下载brew或其他依赖包提示连接超时的问题解决

在下载brew或其他依赖包提示连接超时 错误信息&#xff1a; curl: (7) Failed to connect to [raw.githubusercontent.com](http://raw.githubusercontent.com/) port 443 after 34 ms: Connection refused最简单的方式&#xff0c;就是修改DNS&#xff1a;为114.114.114.114…

网络互联设备(集线器、交换机、路由器)

文章目录 一、中继器和集线器二、网桥和交换机1&#xff09;交换机的三种转发方式2&#xff09;交换机的分类3&#xff09;交换机互连方式 三、路由及路由器1&#xff09;路由器的作用2&#xff09;路由器的逻辑结构3&#xff09;路由器的硬件组成4&#xff09;路由器启动过程 …

【遍历】LeetCode二叉树的遍历、深度系列

文章目录 LeetCode题号104. 二叉树的最大深度111. 二叉树的最小深度144. 94. 二叉树的前序、中序遍历&#xff08;DFS遍历&#xff09;589. 589. N 叉树的前、后序遍历543. 二叉树的直径102. 二叉树的层序遍历 LeetCode题号 简单 104. 二叉树的最大深度&#xff08;DFS遍历法分…

C# RotationDetector 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.RotationDetector 代码 using OpenCvSharp; using Sdcb.RotationDetector; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using …

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏&#xff1a;提升自身的硬实力&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实战掌握技能&#xff0c;助力用户更好利用 CSDN 平台&#xff0c;自主完成项目设计升级&#xff0c;提升自身的硬实力。 专栏订阅&#xff1a;项目大全提升自身的硬实力…

2023MWC精彩回顾 | 未来数字世界中的社交,游戏与娱乐

6月28日至6月30日&#xff0c;由GSMA主办的2023 MWC 上海世界移动通信大会&#xff08;简称“MWC 上海”&#xff09;启幕。「Paraverse平行云」参与组织并主持了本次大会中【未来数字世界中的社交&#xff0c;游戏与娱乐】的主题会议。 「Paraverse平行云」携手上海交通大学、…