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

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.mzph.cn/web/13894.shtml

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

相关文章

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

C++ | Leetcode C++题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* sortedArrayToBST(vector<int>& nums) {return helper(nums, 0, nums.size() - 1);}TreeNode* helper(vector<int>& nums, int left, int right) {if (left > right) {return nu…

算法学习:快速排序

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f680; 引言&#x1f4cc; 快速排序算法核心思想1. 选择基准值&#xff08;Pivot&#xff09;2. 分区操作&#xff08;Partitioning&#xff09;3. 递归排序子序列 &#x1f4cc; JavaScript 实现1. 快速排序主函数2…

基于Perfetto 解读一帧的生产消费流程 Android >= S Qualcomm

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 1.这个流程里面的东西如果展开其实是有很多的 内容其实还是比较浅显的 sf处就不贴源码了 关一个Vsync就有的解释 当然笔者在流程上先形成一个思维闭环 2.如有小伙伴需要 笔…

Java方法的递归

Java方法的递归 前言一、递归的概念示例代码示例 二、递归执行过程分析代码示例执行过程图 三、递归练习代码示例按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)递归求 1 2 3 ... 10写一个递归方法&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和. …

go语言的一些常见踩坑问题

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

【无重复字符的最长子串】python,滑动窗口+哈希表

滑动窗口哈希表 哈希表 seen 统计&#xff1a; 指针 j遍历字符 s&#xff0c;哈希表统计字符 s[j]最后一次出现的索引 。 更新左指针 i &#xff1a; 根据上轮左指针 i 和 seen[s[j]]&#xff0c;每轮更新左边界 i &#xff0c;保证区间 [i1,j] 内无重复字符且最大。 更新结…

JVM学习-垃圾回收器(一)

垃圾回收器 按线程数分类 串行垃圾回收器 串行回收是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合&#xff0c;串行回收器的性能表…

http和https的区别,怎么免费实现https(内涵教学)

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息&#xff0c;因此&…

etcd 和 MongoDB 的混沌(故障注入)测试方法

最近在对一些自建的数据库 driver/client 基础库的健壮性做混沌&#xff08;故障&#xff09;测试, 去验证了解业务的故障处理机制和恢复时长. 主要涉及到了 MongoDB 和 etcd 这两个基础组件. 本文会介绍下相关的测试方法. MongoDB 中的故障测试 MongoDB 是比较世界上热门的文…

AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情

电视猫上面有《庆余年》分集剧情&#xff0c;如何批量爬取下来呢&#xff1f; 先找到每集的链接地址&#xff0c;都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 这个…

短视频矩阵系统4年独立开发正规代发布接口源码搭建部署开发

1. 短视频矩阵源码技术开发要求及实现流程&#xff1a; 短视频矩阵源码开发要求具备视频录制、编辑、剪辑、分享等基本功能&#xff0c;支持实时滤镜、特效、音乐等个性化编辑&#xff0c;能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实…

Web前端开发技术、详细文章、(例子)html 列表、有序列表、无序列表、列表嵌套

目录 列表概述 列表类型与标记符号 无序列表 语法&#xff1a; 语法说明&#xff1a; 无序列表标记的 type 属性及其说明 代码解释 有序列表 基本语法 属性说明 1、列表 o1标记的属性 2、列表项li标记的属性 有序列表 o1标记的属性、值 代码解释 列表嵌套 基本…

FreeBSD/Linux下的系统资源监视器排队队

bpytop bpytop 是一个基于 Python 的资源监视器&#xff0c;可以在 FreeBSD 上使用。它提供了对文件写入磁盘、网络、CPU 和内存占用的监视功能。 pkg install bpytop 或者用ports安装 cd /usr/ports/sysutils/bpytop/ make install clean bashtop bashtop 也是一个基于 P…

化简资源分配图判断是否发生死锁

目录 1.资源分配图的概念 2.判断是否发生死锁 1.资源分配图的概念 资源分配图表示进程和资源之间的请求关系&#xff0c;例如下图&#xff1a; P代表进程&#xff0c;R代表资源&#xff0c;R方框中 有几个圆球就表示有几个这种资源&#xff0c;在图中&#xff0c;R1指向P1&a…

C++ RPC ORM 高速解析

支持所有常用编程语 https://capnproto.org/GitHub - capnproto/capnproto: Capn Proto serialization/RPC system - core tools and C library https://capnproto.org/capnproto-c-win32-1.0.2.zip 常用命令&#xff1a; capnp help capnp compile -oc myschema.capn…

Excel中sum的跨表求和

#实际工作中&#xff0c;一个xlsx文件中会包含多个Excel表格&#xff0c;一般会有“总-分”的关系&#xff0c;如何把分表里的数字汇总到总表里呢&#xff1f; 一般有上图所示的两种表达方式。 可以使用通配符 *&#xff1a;代表任意个数、任意字符&#xff1b; &#xff1f;&…

quartz定时任务

Quartz 数据结构 quartz采用完全二叉树&#xff1a;除了最后一层每一层节点都是满的&#xff0c;而且最后一层靠左排列。 二叉树节点个数规则&#xff1a;每层从左开始&#xff0c;第一层只有一个&#xff0c;就是2的0次幂&#xff0c;第二层两个就是2的1次幂&#xff0c;第三…

DOS学习-目录与文件应用操作经典案例-attrib

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统中的attrib命令是一个用于显示或更改文件&#…

设计模式——职责链(责任链)模式

目录 职责链模式 小俱求实习 结构图 实例 职责链模式优点 职责链模式缺点 使用场景 1.springmvc流程 ​2.mybatis的执行流程 3.spring的过滤器和拦截器 职责链模式 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成…