机器学习 | 掌握 K-近邻算法 的理论实现和调优技巧

目录

初识K-近邻算法

距离度量

K值选择

kd树

数据集划分

特征预处理

莺尾花种类预测(实操)

交叉验证与网格搜索


初识K-近邻算法

K-近邻算法(K-Nearest Neighbor,KNN)是一种基本的分类和回归算法。它的基本思想是通过找出与新对象最近邻的 K 个训练数据,在分类时将新对象归类为出现频率最高的类别。这个算法是机器学习里面一个比较经典的算法,总体来说KNN算法是相对比较容易理解的算法。

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

距离公式:两个样本的距离可以通过如下公式计算,又叫欧式距离。

KNN算法流程总结

1)计算已知类别数据集中的点与当前点之间的距离。

2)按距离递增次序排序。

3)选取与当前点距离最小的k个点。

4)统计前k个点所在的类别出现的频率。

5)返回前k个点出现频率最高的类别作为当前点的预测分类。

关于K-近邻算法API的使用,要知道我们机器学习的流程是:

1)获取数据集 2)数据基本处理 3)特征工程 4)机器学习 5)模型评估

接下来我们开始使用机器学习的算法库:Scikit-learn。其包括许多知名的机器学习算法的实现,文档完善、容易上手、具有丰富的API。其包含的内容:分类、聚类、回归、特征工程、模型选择、调优等功能,非常适合新手小白上手操作。接下来我们终端执行如下命令,开始对其进行安装:

pip install scikit-learn -i https://pypi.mirrors.ustc.edu.cn/simple

接下来通过代码演示如何使用KNeighborsClassifier类构建一个基本的K-近邻分类器并进行数据预测:

from sklearn.neighbors import KNeighborsClassifier

# 构造数据
x = [[1], [2], [10], [20]]
y = [0, 0, 1, 1]

# 模型训练
estimator = KNeighborsClassifier(n_neighbors=1) # 实例化一个估计器对象
estimator.fit(x, y) # 调用fit方法进行训练

# 数据预测
ret1 = estimator.predict([[-1000]]) # 它与训练点[1]的距离最近,标记为[0]
print(ret1)

ret2 = estimator.predict([[1000]]) # 它与训练点[20]的距离最近,标记为[1]
print(ret2)

最终呈现的结果如下所示:

距离度量

距离度量是用来衡量数据对象之间相似性或差异性的方法。它通常用于K-近邻算法、聚类分析、降维算法等各种机器学习任务中。

在机器学习过程中,对于函数dist(.,.,),若它是一“距离度量”,则需要满足一些基本性质:

常见的距离度量包括欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化欧式距离、余弦距离、杰卡德距离等。这些距离度量方法可以根据数据的特点和应用场景进行选择,以便更准确地描述数据对象之间的相似性或差异性。

1)欧氏距离是最常见的距离度量方式,用于衡量数据空间中两点之间的直线距离。

2)曼哈顿距离衡量的是两点在各个坐标轴上的距离总和,也称为城市街区距离。

3)切比雪夫距离也称为棋盘距离,是一种用于衡量向量和点之间的距离的度量方式。

4)闵可夫斯基距离是这两者的泛化,可以根据具体需要调整参数p来实现不同的距离度量方式。

5)标准化欧式距离是一种对欧式距离进行标准化处理的方法,通常用于数据的相似性度量。

6)余弦距离是一种衡量向量之间相似性的度量方式,常用于文本挖掘、信息检索等领域。

7)杰卡德距离是一种用于衡量集合之间差异性的度量方式,常用于计算两个集合的相似性或差异程度。

合适的距离度量方式可以帮助机器学习算法更好地理解和处理数据,从而提高模型的性能和准确度。在实际应用中,选择合适的距离度量方式是非常重要的,因为它直接影响着模型的表现和结果的准确性。

K值选择

在机器学习中,K 值通常用于 K 近邻算法(K-Nearest Neighbors, KNN)中,代表着最近邻的数量。KNN 是一种基本的分类和回归算法,其基本思想是根据样本间的距离来判断新样本的类别或数值。

KNN 算法的工作原理是:对于一个待分类的样本,它的类别取决于其 K 个最近邻样本中最常见的类别。K 值的选择会直接影响到 KNN 的性能和结果。

K 值的选择对 KNN 算法的影响主要体现在以下两个方面

1)容易受噪声数据影响:当 K 值较小时,模型更容易受到噪声数据的干扰。如果 K=1,那么分类结果完全取决于最近邻的类别,这可能导致对噪声数据过度敏感。而当 K 值较大时,模型对噪声数据的影响会减小。

2)模型的复杂度和偏差-方差权衡:较小的 K 值会使得模型更加复杂,因为它需要考虑更多的最近邻数据点。这可能导致模型过拟合,出现高方差的情况。而较大的 K 值会使得模型更简单,可能会导致欠拟合,出现高偏差的情况。

因此,在选择 K 值时需要进行适当的调整和折衷。一般来说,K 值的选择可以通过交叉验证或网格搜索等方法进行模型选择和调优。具体选择哪个 K 值取决于数据集的大小、类别的平衡性、噪声数据的程度以及模型的复杂度等因素。在实际应用中,可以通过尝试不同的 K 值,并评估模型的性能来选择最优的 K 值。

K 值的选择问题

1)选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习"近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习"的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;

2)选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。

3)K=N(N为训练样本个数),则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例中大量有用信息。

名词解释

近似误差:

1)对现有训练集的训练误差,关注训练集。

2)如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。

3)模型本身不是最接近最佳模型。

估计误差:

1)可以理解为对测试集的测试误差,关注测试集。

2)估计误差小说明对未知数据的预测能力好。

3)模型本身最接近最佳模型。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。

kd树

KD 树(KD-Tree)是一种用于快速查找多维空间中最近邻点的数据结构。它是一种二叉树,每个节点代表一个超矩形区域,并且树的每一级都以不同的轴对数据进行分割。

为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里,这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。

根据KNN每次需要预测一个点时,我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高。

最近邻域搜索: kd树(K-dimensiontree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是一种二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一系列的K维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

kd树的构造

1)构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;

2)通过递归的方法,不断地对k维空间进行切分,生成子结点。在超矩形区域上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。

3)上述过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。

4)通常,循环的选择坐标轴对空间切分,选择训练实例点在坐标轴上的中位数为切分点,这样得到的kd树是平衡的(平衡二叉树:它是一棵空树,或其左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是平衡二叉树。

KD树中每个节点是一个向量,和二叉树按照数的大小划分不同的是,KD树每层需要选定向量中的某一维,然后根据这一维按左小右大的方式划分数据。在构建KD树时,关键需要解决2个问题:

1)选择向量的哪一维进行划分;

是随机选择某一维或按顺序选择,但是更好的方法应该是在数据比较分散的那一维进行划分(分散的程度可以根据方差来衡量)

2)如何划分数据;

可以使构建的树比较平衡,可以每次选择中位数来进行划分。

数据集划分

机器学习一般的数据集会划分为两个部分:

1)训练数据:用于训练,构建模型

2)测试数据:在模型校验时使用,用于评估模型是否有效

划分比例:

训练集:70%、80%、75%

测试集:30%、20%、25%

API划分:

参数:

1)数据集的特征值

2)数据集的标签值

3)test_size测试集的大小,一般为float

4)random_state随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。

return:

x_train、x_test、y_train、y_test

下面这段代码是用于将数据集(iris.data 和 iris.target)划分为训练集和测试集的工具。如下:

train_test_split

函数是来自 scikit-learn 库中的一个方法,用于将数据集划分为训练集和测试集。
iris.data

是输入的特征数据,其中包含了花朵的四个特征值(萼片长度、萼片宽度、花瓣长度、花瓣宽度)。
iris.target

是目标数据,其中包含了对应每个样本的分类标签(0、1、2 分别代表三个不同的鸢尾花品种)。
test_size=0.2

指定了测试集的大小,这里是将数据集的 20% 分配给测试集,剩余 80% 作为训练集。
random_state=22

是为了保证每次运行代码时都得到相同的划分结果,它指定了随机数种子。

函数的返回值是四个数组:x_train、x_test、y_train 和 y_test。其中,x_train 和 y_train 是训练集的特征和标签数据,x_test 和 y_test 是测试集的特征和标签数据。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 小数据集获取
iris = load_iris()

# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("训练集的特征值是:\n", x_train)
print("训练集的目标值是:\n", y_train)
print("测试集的特征值是:\n", x_test)
print("测试集的目标值是:\n", y_test)

print("训练集的目标值的形状是:\n", y_train.shape)
print("测试集的目标值的形状是:\n", y_test.shape)

通过将数据集划分为训练集和测试集,我们可以使用训练集来训练机器学习模型,然后使用测试集来评估模型的性能和准确度。这样可以帮助我们了解模型的泛化能力和预测能力。 

特征预处理

特征预处理(Feature Preprocessing)是指对原始数据进行清洗、转换和归一化等操作,以使其适合机器学习算法的输入要求和提高算法的性能。

在进行机器学习任务之前,通常需要对原始数据进行预处理,因为原始数据可能存在以下问题:

1)缺失值:数据中可能存在缺失值,即某些属性的取值为空。缺失值可能会影响模型的训练和预测,因此需要进行缺失值处理,可以通过填充均值、中位数、众数,或者使用插值方法来处理缺失值。

2)异常值:数据中可能存在异常值,即与其他样本明显不同的极端取值。异常值可能是由于测量误差或数据录入错误引起的,需要进行异常值检测和处理,可以通过删除异常值或用合理的取值替代异常值。

3)数据类型转换:数据可能包含不同的数据类型,如文本、类别型数据、数值型数据等。不同的算法对于不同的数据类型有不同的处理方式,因此需要将数据转换为适合算法处理的数据类型。

4)特征缩放:不同的特征可能具有不同的取值范围和单位,这会对某些机器学习算法产生影响。为了避免某些特征对模型的影响过大,需要对特征进行缩放,常见的缩放方法包括标准化和归一化。

5)特征选择:在原始数据中可能存在冗余或无关的特征,这些特征可能会增加模型的复杂度,降低模型的泛化能力。因此,需要对特征进行选择,选取对目标变量有较强相关性的特征。

通过特征预处理,可以使数据更加干净、可靠,并为机器学习算法提供更有用和可解释的特征,从而提高模型的准确性和性能。这里博主不可能全部讲解到上面的内容,这里就拿特征缩放进行举例:

标准化:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内:

对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。 

下面这段代码的核心是利用 StandardScaler 对象对数据进行标准化处理,并打印出标准化后的数据、每一列的方差和每一列的平均值。

import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand():
    # 标准化演示
    data = pd.read_csv("dating.txt", sep='\t')
    print(data)
    # 实例化
    transfer = StandardScaler()
    # 进行转换,调用fit_transform
    ret_data = transfer.fit_transform(data[["milage", "Liters", "Consumtime"]])
    print("标准化之后的数据为:\n", ret_data)
    print("每一列的方差为:\n", transfer.var_)
    print("每一列的平均值为:\n", transfer.mean_)

stand()

最终呈现的结果为:

归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间。其公式如下:

对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变。这里通过下面的这个例子来理解上面的过程:

下面这段代码的核心是利用 MinMaxScaler 对象对数据进行归一化处理,从而将数据缩放到指定的特征范围内,这在机器学习和数据分析中是非常常见的预处理步骤。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax():
    # 归一化演示
    data = pd.read_csv("dating.txt", sep='\t')
    print(data)
    # 实例化
    transfer = MinMaxScaler(feature_range=(3, 5)) # 指定归一化后的特征范围
    # # 进行转换,调用fit_transform
    ret_data = transfer.fit_transform(data[["milage", "Liters", "Consumtime"]])
    print("归一化之后的数据为:\n", ret_data)

minmax()

最终呈现的效果如下:

莺尾花种类预测(实操)

导入模块

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

获取数据

iris = load_iris()

数据基本处理:这段代码的主要作用是将数据集划分为训练集和测试集,以便在机器学习模型的训练和评估过程中使用。通过将数据集划分为独立的训练集和测试集,可以更好地评估模型对新数据的泛化能力。其中设置的随机种子 random_state=22 保证了每次划分的结果都是固定的,有助于结果的复现性。

x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)

特征工程-特征预处理:在这段代码中,首先在训练集上调用 fit_transform() 方法计算并应用标准化转换,得到标准化后的训练集特征数据 x_train。然后,在测试集上调用 transform() 方法使用训练集上计算得到的均值和标准差来进行标准化转换,得到标准化后的测试集特征数据 x_test。

transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # 计算均值和标准差
x_test = transfer.transform(x_test)

机器学习-KNN:在这段代码中,首先通过创建 KNeighborsClassifier 对象来实例化一个 K 近邻分类器,然后使用 fit() 方法对该分类器进行训练。训练过程就是让分类器从训练集中学习特征与标签之间的关系,从而构建一个能够进行分类预测的模型。

estimator = KNeighborsClassifier(n_neighbors=5) # 实例化一个估计器
estimator.fit(x_train, y_train) # 模型训练

模型评估:这段代码的主要作用是评估训练好的 K 近邻分类器在测试集上的表现。首先通过 predict() 方法进行预测,然后通过比较预测值与真实值来评估分类器的准确率。最终输出预测值、预测值与真实值的对比结果以及分类器在测试集上的准确率。

y_pre = estimator.predict(x_test) # 预测值结果输出
print("预测值是: \n", y_pre)
print("预测值与真实值的对比是: \n", y_pre == y_test)

score = estimator.score(x_test, y_test) # 准确率计算
print("准确率为: \n", score)

当然我们可以关闭随机数种子,让准确率发生变化,最终呈现的效果如下:

总结

交叉验证与网格搜索

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

我们之前知道数据分为训练集和测试集,但是为了让从训练得到模型结果更加准确。做以下处理:

训练集:训练集+验证集;测试集:测试集

交叉验证的目的:为了让被评估的模型更加准确可信。这个只是让被评估的模型更加准确可信,那么怎么选择或者调优参数呢?这里需要用到下面的网格搜索:

网格搜索:通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

以下是代码示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1.获取数据
iris = load_iris()

# 2.数据基本处理
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)

# 3.特征工程-特征预处理
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # 计算均值和标准差
x_test = transfer.transform(x_test)

# 4.机器学习-KNN
estimator = KNeighborsClassifier() # 实例化一个估计器
estimator.fit(x_train, y_train)  # 调用 fit 方法进行训练

# 4.1 模型调优-交叉验证,网格搜索
param_grid = {"n_neighbors": [1, 3, 5, 7]}
grid_search = GridSearchCV(estimator, param_grid=param_grid, cv=5)
grid_search.fit(x_train, y_train)  # 对已经训练过的分类器应用 GridSearchCV

# 5.模型评估
y_pre = grid_search.predict(x_test) # 预测值结果输出
print("预测值是: \n", y_pre)
print("预测值与真实值的对比是: \n", y_pre == y_test)

score = grid_search.score(x_test, y_test) # 准确率计算
print("准确率为: \n", score)

# 查看交叉验证网格搜索的一些属性
print("在交叉验证中,得到的最好结果是: \n", grid_search.best_score_)
print("在交叉验证中,得到的最好模型是: \n", grid_search.best_estimator_)
print("在交叉验证中,得到的模型结果是: \n", grid_search.cv_results_)

最终呈现的结果为:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万户 ezOFFICE DocumentEdit_unite.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具,在数据获取方面也是十分好用,能够十分快速的见到效果,这都取决于selenium框架的足够的灵活性,甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令,哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…

【三】【C++】类与对象(二)

类的六个默认成员函数 在C中,有六个默认成员函数,它们是编译器在需要的情况下自动生成的成员函数,如果你不显式地定义它们,编译器会自动提供默认实现。这些默认成员函数包括: 默认构造函数 (Default Constructor)&…

设计模式之框架源码剖析(实战+图解)

Java设计模式 1,概述 随着软件开发人员人数的增多,一些公司急需一些高端人才。作为一个高端人才,设计面向对象软件是必不可少的能力,而软件设计是需要很深的功力,设计模式就要求你必须掌握。 2,本章特色…

中国地区cetos7.9 install kubeadmin

第 1 步:禁用 SELinux(可选但推荐) 如何在 CentOS 7 上查找 SELinux 状态 sestatus另一种选择是运行以下 cat 命令: vi /etc/selinux/config SELINUXdisabled rebootcentos7 linux 安装k8s前下面操作的作用是? cat…

基于JAVA的河南软件客服系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些? Java程序存储数据(变量、对象、数组、集合),数据保存在内存中,属于瞬时状态存储。文件&…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

开源知识库:让企业低成本实现知识管理

管理和利用企业内部知识已经成为提升效率和竞争力的重要手段。而对于大多数企业,尤其是中小企业而言,如何在有限的预算下,实现高效的知识管理,仍是一项挑战。面对这一问题,开源知识库应运而生。今天,我们将…

Linux - 数据流重定向、管道符、环境变量配置文件的加载

概述 想了解Linux编程,shell脚本是绕不开的关键知识点,原计划写一个整篇来分享shell的来龙去脉,但知识点过于繁杂,先分享一下学习shell的准备工作,数据流重定向、管道符、环境变量配置文件的加载,有助于知…

jdk17新特性—— instanceof的模式匹配

目录 一、instanceof模式匹配的概述二、instanceof模式匹配代码示例2.1、jdk17之前 instanceof用法 代码示例2.2、jdk17及之后 instanceof用法 代码示例一2.3、jdk17及之后 instanceof用法 代码示例二 一、instanceof模式匹配的概述 instanceof增加了模式匹配功能,…

Vulnhub靶机:niveK

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:niveK(10.0.2.41) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.com/hms/nive…

算法训练第一周考试(思维性题目)

目录 第一题.满足约束 第二题:传递信息 第三题:无线替换 第四题:环球旅行 第五题:求和游戏 第六题:大相径庭数组 总结:其实这次考试主要都是一些思维性的题集,并没有过难的东西&#xff…

五、防御保护---防火墙出口选路篇

五、防御保护---防火墙智能选路篇 一、就近选路二、策略路由选路1.策略路由的概念1.1匹配条件(通过ACL定义)1.2动作 三、智能选路 --- 全局路由策略1.基于链路带宽的负载分担2.基于链路质量进行负载分担3.基于链路权重进行负载分担4.基于链路优先级的主备…

shell - sed命令和awk命令

一.sed 的高级用法 sed 中除了模式空间,还另外支持保持空间,利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。 常见命令: 选项含义P(大)打印模…

【MySQL】学习如何通过DQL进行数据库数据的基本查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KvH5jXnPNsRtMkOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Docker部署Plik系统并结合内网穿透实现远程访问本地上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路: 解法二:生产者-消费者解法 1.把 hydrogen 线程看作生产者,oxygen 线程看作消费者,缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

找不到xinput1_4.dll怎么办?xinput1_4.dll丢失的6种解决方法对比

无法找到或缺失xinput1_4.dll文件可能会引发一系列问题,这一现象在计算机系统中并不罕见。首先,它直接影响到某些应用程序的正常运行,特别是那些依赖于DirectX环境的游戏和软件,因为xinput1_4.dll是DirectX工具包中的一个重要组成…