Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明

news2024/11/17 19:43:08

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明

目录

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明

一、简单介绍

二、数据表示与特征工程

数据表示

特征工程

三、分类变量

1、One-Hot编码(虚拟变量)

附录

一、参考文献


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

Python 机器学习是利用 Python 编程语言中的各种工具和库来实现机器学习算法和技术的过程。Python 是一种功能强大且易于学习和使用的编程语言,因此成为了机器学习领域的首选语言之一。Python 提供了丰富的机器学习库,如Scikit-learn、TensorFlow、Keras、PyTorch等,这些库包含了许多常用的机器学习算法和深度学习框架,使得开发者能够快速实现、测试和部署各种机器学习模型。

Python 机器学习涵盖了许多任务和技术,包括但不限于:

  1. 监督学习:包括分类、回归等任务。
  2. 无监督学习:如聚类、降维等。
  3. 半监督学习:结合了有监督和无监督学习的技术。
  4. 强化学习:通过与环境的交互学习来优化决策策略。
  5. 深度学习:利用深度神经网络进行学习和预测。

通过 Python 进行机器学习,开发者可以利用其丰富的工具和库来处理数据、构建模型、评估模型性能,并将模型部署到实际应用中。Python 的易用性和庞大的社区支持使得机器学习在各个领域都得到了广泛的应用和发展。

二、数据表示与特征工程

之前我们一直假设数据是由浮点数组成的二维数组,其中每一列是描述数据点的 连续特征 (continuous feature)。对于许多应用而言,数据的收集方式并不是这样。一种特别常见的特征类型就是分类特征 (categorical feature),也叫离散特征 (discrete feature)。这种特征通常并不是数值。分类特征与连续特征之间的区别类似于分类和回归之间的区别,只是前者在输入端而不是输出端。我们已经见过的连续特征的例子包括像素明暗程度和花的尺寸测量。分类特征的例子包括产品的品牌、产品的颜色或产品的销售部门(图书、服装、硬件)。这些都是描述一件产品的属性,但它们不以连续的方式变化。一件产品要么属于服装部门,要么属于图书部门。在图书和服装之间没有中间部门,不同的分类之间也没有顺序(图书不大于服装也不小于服装,硬件不在图书和服装之间,等等)。

无论你的数据包含哪种类型的特征,数据表示方式都会对机器学习模型的性能产生巨大影响。我们在之前案例可以中看到,数据缩放非常重要。换句话说,如果你没有缩放数据(比如,缩放到单位方差),那么你用厘米还是英寸表示测量数据的结果将会不同。我们在之前的案例中还看到,用额外的特征扩充 (augment)数据也很有帮助,比如添加特征的交互项(乘积)或更一般的多项式。

对于某个特定应用来说,如何找到最佳数据表示,这个问题被称为特征工程 (feature engineering),它是数据科学家和机器学习从业者在尝试解决现实世界问题时的主要任务之一。用正确的方式表示数据,对监督模型性能的影响比所选择的精确参数还要大。

机器学习中的数据表示与特征工程是模型训练的基础环节。

  • 数据表示指的是如何将原始数据转换为机器学习算法可以处理的形式。
  • 特征工程是指从原始数据中提取或创建特征,以便更好地进行模型训练。

以下是关于数据表示和特征工程的详细介绍:

数据表示

  1. 数值数据: 最常见的数据类型,可以直接用于大多数机器学习算法。包括整数和浮点数。

    • 示例:年龄、收入、评分等。
  2. 分类数据: 包含离散的类别或标签,需要转换为数值形式才能用于算法中。

    • 标签编码(Label Encoding): 将每个类别映射为一个整数。
    • 独热编码(One-Hot Encoding): 使用二进制向量表示每个类别。
    • 示例:性别(男、女)、城市(纽约、伦敦、巴黎)等。
  3. 文本数据: 需要转换为数值表示,常用方法有:

    • 词袋模型(Bag of Words): 统计每个单词在文本中出现的次数。
    • TF-IDF(Term Frequency-Inverse Document Frequency): 考虑单词在文档和整个语料库中的频率。
    • 词向量(Word Embeddings): 使用预训练的词向量模型(如Word2Vec、GloVe)将单词表示为向量。
  4. 时间序列数据: 包含时间戳和相应的值。常用的方法有:

    • 时间特征提取: 提取如年、月、日、小时、星期几等特征。
    • 滑动窗口: 创建时间窗口来捕捉短期趋势。
    • 差分处理: 计算当前值与前一个值的差异。

特征工程

  1. 特征选择: 从原始数据中选择对预测任务最有用的特征。

    • 过滤法(Filter Method): 基于统计特性选择特征,如方差选择、互信息选择等。
    • 包裹法(Wrapper Method): 使用特定的机器学习模型选择特征,如递归特征消除(RFE)。
    • 嵌入法(Embedded Method): 在模型训练过程中选择特征,如LASSO回归中的L1正则化。
  2. 特征提取: 从原始数据中提取新的特征。

    • 主成分分析(PCA): 降维技术,通过线性变换将数据映射到新的特征空间。
    • 独立成分分析(ICA): 类似于PCA,但假设特征是独立的。
    • 特征聚合: 将多个特征组合在一起,如求和、平均等。
  3. 特征构造: 基于现有特征创建新的特征。

    • 多项式特征: 创建特征的多项式组合,如𝑥12,𝑥1𝑥2x12​,x1​x2​等。
    • 交互特征: 计算两个或多个特征的交互作用,如乘积、比值等。
  4. 特征缩放: 将特征值缩放到相同范围,以提高模型的稳定性和收敛速度。

    • 标准化(Standardization): 将特征缩放到均值为0,方差为1的分布。
    • 归一化(Normalization): 将特征缩放到指定范围(通常是0到1)。

三、分类变量

作为例子,我们将使用美国成年人收入的数据集,该数据集是从 1994 年的普查数据库中导出的。adult 数据集的任务是预测一名工人的收入是高于 50 000 美元还是低于 50 000 美元。这个数据集的特征包括工人的年龄、雇用方式(独立经营、私营企业员工、政府职员等)、教育水平、性别、每周工作时长、职业,等等。表 4-1 给出了该数据集中的前几个条目。

表4-1:adult 数据集的前几个条目
 ageworkclasseducationgenderhours-per-weekoccupationincome
039State-govBachelorsMale40Adm-clerical<=50K
150Self-emp-not-incBachelorsMale13Exec-managerial<=50K
238PrivateHS-gradMale40Handlers-cleaners<=50K
353Private11thMale40Handlers-cleaners<=50K
428PrivateBachelorsFemale40Prof-specialty<=50K
537PrivateMastersFemale40Exec-managerial<=50K
649Private9thFemale16Other-service<=50K
752Self-emp-not-incHS-gradMale45Exec-managerial>50K
831PrivateMastersFemale50Prof-specialty>50K
942PrivateBachelorsMale40Exec-managerial>50K
1037PrivateSome-collegeMale80Exec-managerial>50K

这个任务属于分类任务,两个类别是收入 <=50k>50k 。也可以预测具体收入,那样就变成了一个回归任务。但那样问题将变得更加困难,而理解 50K 的分界线本身也很有趣。

在这个数据集中,age (年龄)和 hours-per-week (每周工作时长)是连续特征,我们知道如何处理这种特征。但 workclass (工作类型)、education (教育程度)、gender (性别)、occupation (职业)都是分类特征。它们都来自一系列固定的可能取值(而不是一个范围),表示的是定性属性(而不是数量)。

首先,假设我们想要在这个数据上学习一个 Logistic 回归分类器。我们在第 2 章学过,Logistic 回归利用下列公式进行预测,预测值为 \hat{y}

其中 w [i ] 和 b 是从训练集中学到的系数,x [i ] 是输入特征。当 x [i ] 是数字时这个公式才有意义,但如果 x [2] 是 "Masters" 或 "Bachelors" 的话,这个公式则没有意义。显然,在应用 Logistic 回归时,我们需要换一种方式来表示数据。下一节将会说明我们如何解决这一问题。

1、One-Hot编码(虚拟变量)

到目前为止,表示分类变量最常用的方法就是使用 one-hot 编码 (one-hot-encoding)或 N 取一编码 (one-out-of-N encoding),也叫虚拟变量 (dummy variable)。虚拟变量背后的思想是将一个分类变量替换为一个或多个新特征,新特征取值为 0 和 1。对于线性二分类(以及 scikit-learn 中其他所有模型)的公式而言,0 和 1 这两个值是有意义的,我们可以像这样对每个类别引入一个新特征,从而表示任意数量的类别。

比如说,workclass 特征的可能取值包括 "Government Employee""Private Employee""Self Employed""Self Employed Incorporated" 。为了编码这 4 个可能的取值,我们创建了 4 个新特征,分别叫作 "Government Employee""Private Employee""Self Employed""Self Employed Incorporated" 。如果一个人的 workclass 取某个值,那么对应的特征取值为 1,其他特征均取值为 0。因此,对每个数据点来说,4 个新特征中只有一个的取值为 1。这就是它叫作 one-hot 编码或 N 取一编码的原因。

其原理如表 4-2 所示。利用 4 个新特征对一个特征进行编码。在机器学习算法中使用此数据时,我们将会删除原始的 workclass 特征,仅保留 0-1 特征。

表4-2:利用one-hot编码来编码workclass 特征
workclassGovernment EmployeePrivate EmployeeSelf EmployedSelf Employed Incorporated
Government Employee1000
Private Employee0100
Self Employed0010
Self Employed Incorporated0001

我们使用的 one-hot 编码与统计学中使用的虚拟编码(dummy encoding)非常相似,但并不完全相同。为简单起见,我们将每个类别编码为不同的二元特征。在统计学中,通常将具有 k 个可能取值的分类特征编码为 k - 1 个特征(都等于零表示最后一个可能取值)。这么做是为了简化分析(更专业的说法是,这可以避免使数据矩阵秩亏)。

将数据转换为分类变量的 one-hot 编码有两种方法:一种是使用 pandas ,一种是使用 scikit-learn 。在写作本书时,使用 pandas 要稍微简单一些,所以我们选择这种方法。首先,我们使用 pandas 从逗号分隔值(CSV)文件中加载数据:

import pandas as pd
from IPython.display import display

# 文件中没有包含列名称的表头,因此我们传入header=None
# 然后在"names"中显式地提供列名称
data = pd.read_csv(
    "data/adult.data", header=None, index_col=False,
    names=['age', 'workclass', 'fnlwgt', 'education',  'education-num',
           'marital-status', 'occupation', 'relationship', 'race', 'gender',
           'capital-gain', 'capital-loss', 'hours-per-week', 'native-country',
           'income'])
# 为了便于说明,我们只选了其中几列
data = data[['age', 'workclass', 'education', 'gender', 'hours-per-week',
             'occupation', 'income']]
# IPython.display可以在Jupyter notebook中输出漂亮的格式
display(data.head())

运行结果见表 4-3

表4-3:adult 数据集的前5行
 ageworkclasseducationgenderhours-per-weekoccupationincome
039State-govBachelorsMale40Adm-clerical<=50K
150Self-emp-not-incBachelorsMale13Exec-managerial<=50K
238PrivateHS-gradMale40Handlers-cleaners<=50K
353Private11thMale40Handlers-cleaners<=50K
428PrivateBachelorsFemale40Prof-specialty<=50K

1)检查字符串编码的分类数据

读取完这样的数据集之后,最好先检查每一列是否包含有意义的分类数据。在处理人工(比如网站用户)输入的数据时,可能没有固定的类别,拼写和大小写也存在差异,因此可能需要预处理。举个例子,有人可能将性别填为“male”(男性),有人可能填为“man”(男人),而我们希望能用同一个类别来表示这两种输入。检查列的内容有一个好方法,就是使用 pandas Series (Series 是 DataFrame 中单列对应的数据类型)的 value_counts 函数,以显示唯一值及其出现次数:

print(data.gender.value_counts())
gender
Male      21790
Female    10771
Name: count, dtype: int64

可以看到,在这个数据集中性别刚好有两个值:MaleFemale ,这说明数据格式已经很好,可以用 one-hot 编码来表示。在实际的应用中,你应该查看并检查所有列的值。为简洁起见,这里我们将跳过这一步。

pandas 编码数据有一种非常简单的方法,就是使用 get_dummies 函数。get_dummies 函数自动变换所有具有对象类型(比如字符串)的列或所有分类的列(这是 pandas 中的一个特殊概念,我们还没有讲到):

print("Original features:\n", list(data.columns), "\n")
data_dummies = pd.get_dummies(data)
print("Features after get_dummies:\n", list(data_dummies.columns))
Original features:
 ['age', 'workclass', 'education', 'gender', 'hours-per-week', 'occupation', 'income'] 

Features after get_dummies:
 ['age', 'hours-per-week', 'workclass_ ?', 'workclass_ Federal-gov', 'workclass_ Local-gov', 'workclass_ Never-worked', 'workclass_ Private', 'workclass_ Self-emp-inc', 'workclass_ Self-emp-not-inc', 'workclass_ State-gov', 'workclass_ Without-pay', 'education_ 10th', 'education_ 11th', 'education_ 12th', 'education_ 1st-4th', 'education_ 5th-6th', 'education_ 7th-8th', 'education_ 9th', 'education_ Assoc-acdm', 'education_ Assoc-voc', 'education_ Bachelors', 'education_ Doctorate', 'education_ HS-grad', 'education_ Masters', 'education_ Preschool', 'education_ Prof-school', 'education_ Some-college', 'gender_ Female', 'gender_ Male', 'occupation_ ?', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving', 'income_ <=50K', 'income_ >50K']

你可以看到,连续特征 agehours-per-week 没有发生变化,而分类特征的每个可能取值都被扩展为一个新特征:

data_dummies.head()

运行结果如下表:

 agehours-per-weekworkclass_ ?workclass_ Federal-govworkclass_ Local-govworkclass_ Never-workedworkclass_ Privateworkclass_ Self-emp-incworkclass_ Self-emp-not-incworkclass_ State-gov...occupation_ Machine-op-inspctoccupation_ Other-serviceoccupation_ Priv-house-servoccupation_ Prof-specialtyoccupation_ Protective-servoccupation_ Salesoccupation_ Tech-supportoccupation_ Transport-movingincome_ <=50Kincome_ >50K
03940FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
15013FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
23840FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
35340FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE
42840FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSE...FALSEFALSEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSE

5 rows×46 columns

下面我们可以使用 values 属性将 data_dummies 数据框(DataFrame )转换为 NumPy 数组,然后在其上训练一个机器学习模型。在训练模型之前,注意要把目标变量(现在被编码为两个 income 列)从数据中分离出来。将输出变量或输出变量的一些导出属性包含在特征表示中,这是构建监督机器学习模型时一个非常常见的错误。

注意:pandas 中的列索引包括范围的结尾,因此 'age':'occupation_Transport-moving' 中包括 occupation_Transport-moving 。这与 NumPy 数组的切片不同,后者不包括范围的结尾,例如 np.arange(11)[0:10] 不包括索引编号为 10 的元素。

在这个例子中,我们仅提取包含特征的列,也就是从 age 到 occupation_ Transport-moving 的所有列。这一范围包含所有特征,但不包含目标:

features = data_dummies.loc[:, 'age':'occupation_ Transport-moving']
# 提取NumPy数组
X = features.values
y = data_dummies['income_ >50K'].values
print("X.shape: {}  y.shape: {}".format(X.shape, y.shape))
X.shape: (32561, 44)  y.shape: (32561,)

现在数据的表示方式可以被 scikit-learn 处理,我们可以像之前一样继续下一步:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
print("Test score: {:.2f}".format(logreg.score(X_test, y_test)))
Test score: 0.81

在这个例子中,我们对同时包含训练数据和测试数据的数据框调用 get_dummies 。这一点很重要,可以确保训练集和测试集中分类变量的表示方式相同。

假设我们的训练集和测试集位于两个不同的数据框中。如果 workclass 特征的 "Private Employee" 取值没有出现在测试集中,那么 pandas 会认为这个特征只有 3 个可能的取值,因此只会创建 3 个新的虚拟特征。现在训练集和测试集的特征个数不相同,我们就无法将在训练集上学到的模型应用到测试集上。更糟糕的是,假设 workclass 特征在训练集中有 "Government Employee" 和 "Private Employee" 两个值,而在测试集中有 "Self Employed" 和 "Self Employed Incorporated" 两个值。在两种情况下,pandas 都会创建两个新的虚拟特征,所以编码后的数据框的特征个数相同。但在训练集和测试集中的两个虚拟特征含义完全不同。训练集中表示 "Government Employee" 的那一列在测试集中对应的是 "Self Employed" 。

如果我们在这个数据上构建机器学习模型,那么它的表现会很差,因为它认为每一列表示的是相同的内容(因为位置相同),而实际上表示的却是非常不同的内容。要想解决这个问题,可以在同时包含训练数据点和测试数据点的数据框上调用 get_dummies ,也可以确保调用 get_dummies 后训练集和测试集的列名称相同,以保证它们具有相同的语义。

adult 数据集的例子中,分类变量被编码为字符串。一方面,可能会有拼写错误;但另一方面,它明确地将一个变量标记为分类变量。无论是为了便于存储还是因为数据的收集方式,分类变量通常被编码为整数。例如,假设adult 数据集中的人口普查数据是利用问卷收集的,workclass 的回答被记录为 0(在第一个框打勾)、1(在第二个框打勾)、2(在第三个框打勾),等等。现在该列包含数字 0 到 8,而不是像 "Private" 这样的字符串。如果有人观察表示数据集的表格,很难一眼看出这个变量应该被视为连续变量还是分类变量。但是,如果知道这些数字表示的是就业状况,那么很明显它们是不同的状态,不应该用单个连续变量来建模。

分类特征通常用整数进行编码。它们是数字并不意味着它们必须被视为连续特征。一个整数特征应该被视为连续的还是离散的(one-hot 编码的),有时并不明确。如果在被编码的语义之间没有顺序关系(比如 workclass 的例子),那么特征必须被视为离散特征。对于其他情况(比如五星评分),哪种编码更好取决于具体的任务和数据,以及使用哪种机器学习算法。

pandas 的 get_dummies 函数将所有数字看作是连续的,不会为其创建虚拟变量。为了解决这个问题,你可以使用 scikit-learn 的 OneHotEncoder ,指定哪些变量是连续的、哪些变量是离散的,你也可以将数据框中的数值列转换为字符串。为了说明这一点,我们创建一个两列的 DataFrame 对象,其中一列包含字符串,另一列包含整数:

# 创建一个DataFrame,包含一个整数特征和一个分类字符串特征
demo_df = pd.DataFrame({'Integer Feature': [0, 1, 2, 1],
                        'Categorical Feature': ['socks', 'fox', 'socks', 'box']})
display(demo_df)

运行结果见表 4-4

其结果见表 4-4
 Integer FeatureCategorical Feature
00socks
11fox
22socks
31box

使用 get_dummies 只会编码字符串特征,不会改变整数特征,正如表 4-5 所示。

pd.get_dummies(demo_df)
表4-5:表4-4中数据的one-hot编码版本,整数特征不变
 Integer FeatureCategorical Feature_boxCategorical Feature_foxCategorical Feature_socks
00FALSEFALSETRUE
11FALSETRUEFALSE
22FALSEFALSETRUE
31TRUEFALSEFALSE

如果你想为“Integer Feature”这一列创建虚拟变量,可以使用 columns 参数显式地给出想要编码的列。于是两个特征都会被当作分类特征处理(见表 4-6):

demo_df['Integer Feature'] = demo_df['Integer Feature'].astype(str)
pd.get_dummies(demo_df, columns=['Integer Feature', 'Categorical Feature'])
表4-6:对表4-4中的数据做one-hot编码,同时编码整数特征和字符串特征
 Integer Feature_0Integer Feature_1Integer Feature_2Categorical Feature_boxCategorical Feature_foxCategorical Feature_socks
0TRUEFALSEFALSEFALSEFALSETRUE
1FALSETRUEFALSEFALSETRUEFALSE
2FALSEFALSETRUEFALSEFALSETRUE
3FALSETRUEFALSETRUEFALSEFALSE

附录

一、参考文献

参考文献:[德] Andreas C. Müller [美] Sarah Guido 《Python Machine Learning Basics Tutorial》

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

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

相关文章

rk3568_spinlock

文章目录 前言1、spinlock是什么?2、自旋锁实验2.1源码2.2 结果图总结前言 本文记录在rk3568开发板做的自旋锁实验。通过自旋锁控制state变量来限制只有一个应用程序来打开驱动设备。 1、spinlock是什么? spinlock称为自旋锁,如果获取不到资源,就只能一直傻傻地等待资源被…

提高Java编程效率:ArrayList类的使用技巧

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

乐理学习-音及音名

1. 我觉得练习题很重要。我要得到一个反馈 所以我想没学习完书中的一节就要把练习题做下来&#xff0c;虽然慢点也可以。 2. 做个小计划。 今天计算了一下学完《基本乐理-李重光》如果每天3张。也要80天干完&#xff0c;希望能有一天可以学习7张的速度的时候。 3. 练习记录…

如何利用已有数据对模型进行微调

1.langchain整合llm做知识问答 利用LangChain的能力来结合检索和生成&#xff0c;形成一个知识增强的问答系统&#xff08;不涉及对模型的微调&#xff09;&#xff0c;而是利用llm从文档检索到问题解答。 langchain整合llm做知识检索 2.微调llm模型 1、首先是我们的数据集&…

从0开始学统计-秩和检验

1.什么是秩和检验&#xff1f; 秩和检验&#xff0c;也称为Wilcoxon 秩和检验&#xff0c;是一种非参数统计检验方法&#xff0c;用于比较两个独立样本的中位数是否有显著差异。它不要求数据满足正态分布假设&#xff0c;因此适用于小样本或者数据不满足正态分布假设的情况。 …

Android 快速调试网络 复制curl 到postMan

搜索这个插件 官网地址&#xff1a;https://github.com/itkacher/OkHttpProfiler 集成教程也在里面集成完毕后右下角有一个入口点进去可以复制curl| 插件名称&#xff1a;Okhttp Profiler 真的很好用&#xff01;

Ubuntu server 24 源码安装Quagga 支持动态路由协议ospf bgp

1 下载:GitHub - Quagga/quagga: Quagga Tracking repository - Master is at http://git.savannah.gnu.org/cgit/quagga.git 2 安装 #安装依赖包 sudo apt install gcc make libreadline-dev pkg-config #解压 tar zxvf quagga-1.2.4.tar.gz cd quagga-1.2.4/sudo ./co…

Linux(五)

Linux&#xff08;五&#xff09; 结构体如何定义一个结构体如何定义一个结构体变量结构体变量如何访问成员如何定义一个指向结构体的指针 动态分配空间 malloc,free在堆区分配5个存Stu的空间 #include <stdio.h> //编写一子函数,对pstr中的值进行输出 /*void output(int…

【开源】租房管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、系统介绍 租客屋主模块 房源信息模块 租客评价模块 房源订单模块 留言板模块 二、系统截图 三、核心代码 一、系统介绍 基于Vue.js和SpringBoot的租房管理系统&#xff0c;分为管理后台和用户网页端&#xff0c;可以给管理员、租客和屋主角色使用&#xff0c…

Layui设置table表格中时间的显示格式

1、问题概述? 【数据库中的时间格式】 【Layui中table表格默认的显示格式】 默认的格式中会显示时间的毫秒单位,但是这个毫秒有时候是不需要的。 总结:这个时候我们就需要定义table表格中的时间显示格式。 2、解决办法? 【解决后时间的显示格式】 【解决办法1:通过字符…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

开发依赖与运行依赖

1. 概念 开发依赖&#xff1a;devDependencies 运行依赖&#xff1a;dependencies 2. 理解 &#xff08;1&#xff09;devDependencies 在线上状态不需要使用的依赖&#xff0c;就是开发依赖。为什么 npm 要把它单独分拆出来呢&#xff1f;最终目的是为了减少 node_modul…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

《德米安:彷徨少年时》

文前 我之所愿无非是尝试依本性而生活&#xff0c; 却缘何如此之难&#xff1f; 强盗 疏于独立思考和自我评判的人只能顺应现成的世俗法则&#xff0c;让生活变轻松。其他人则有自己的戒条&#xff1a;正派人惯常做的事于他可能是禁忌&#xff0c;而他自认合理的或许遭他人唾…

Mac安装pytorch

先下载 Anaconda | The Operating System for AI 网速慢&#xff0c;用中国大陆镜像&#xff1a;NJU Mirror 之前装python3时用的是pip3&#xff0c;这里说一下这pip与conda的区别 Conda和pip都是Python包管理工具&#xff0c;用于安装和管理Python包 包管理范围&#xff1a…

简单的基于信号处理的心电信号ECG特征波分割方法(MATLAB)

正常的心电图中&#xff0c;每个心跳周期内包含三个主要的特征波&#xff1a;&#xff30;波、QRS波和&#xff34;波&#xff0c;如下图所示。心电特征波能够反映心脏的生理状态信息&#xff0c;通过对其形状、幅值和持续时间的分析&#xff0c;可以用来辅助诊断心血管疾病。对…

Java顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我帮助很大。我想与…

深入解析BGP与OSPF:互联网与企业网络中的路由协议对比

BGP&#xff08;Border Gateway Protocol&#xff09;和OSPF&#xff08;Open Shortest Path First&#xff09;是两种不同的路由协议&#xff0c;它们在互联网和企业网络中扮演着重要的角色。下面是它们各自特点的详细内容丰富&#xff1a; BGP&#xff08;Border Gateway Pro…

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度 leecode 226 翻转二叉树 题目链接 &#xff1a;https://leetcode.cn/problems/invert-binary-tree/description/ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。…

Neovim 配置全面解析(上)

Neovim 配置全面解析&#xff08;上&#xff09; 原文&#xff1a;Neovim 配置全面解析&#xff08;上&#xff09; - 知乎 (zhihu.com) 环境&#xff1a;Ubuntu 20.04 宿主机&#xff1a;windows &#xff08;windows terminal&#xff09;WSL 2 NVIM&#xff1a;v 0.10.0-de…