机器学习算法——分类任务
算法:
1、决策树
2、随机森林
3、梯度提升树
4、逻辑回归
5、支持向量机SVM
6、K近邻 KNN
7、朴素贝叶斯
8、多层感知机
9、统一分类
10、比较总结
11、完整代码
1、决策树
1.1 Decision Tree Analysis (C4.5,CART,CHAID)决策树
算法 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|
ID3 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 二叉树 | 基尼系数 | 支持 | 支持 | 支持 |
CHAID | 多叉树 | 卡方检验 | 支持 | 支持 | 支持 |
1.2 决策树核心思想
决策树是一个树结构(可以是二叉树或非二叉树),其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个输出类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策树学习通常包含这几个方面:特征选择、决策树生成、决策树剪枝、缺失值/异常值处理、决策树集成学习。(由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。)
可把连续取值的数据值域划分为多个区间,并将每个区间视为该特征的一个取值,如此就完成了从连续性数据到离散性数据的转变。
1.3 决策算法
1.3.1 ID3
ID3算法就是用信息增益大小来判断当前节点应该用什么特征来构建决策树,用计算出的信息增益最大的特征来建立决策树的当前节点。
缺点:
不能处理连续特征(只能处理离散值);
在相同条件下,取值比较多的特征比取值少的特征信息增益大。使用信息增益作为标准容易偏向于取值较多的特征;
对于缺失值的情况没有做考虑;
没有考虑过拟合的问题;
1.3.2 C4.5
对ID3算法进行改进。将连续的特征离散化、引入信息增益比(信息增益和特征熵的比值)进行特征选择、缺失值处理:一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理。引入了正则化系数进行初步剪枝防止过拟合。
缺点:
剪枝算法待优化;
生成的是多叉树,效率没有二叉树优;
只能用于分类,不能用于回归;
使用了熵模型,有大量耗时的对数运算,如果是连续值还有大量的排序运算。
1.3.3 CART
无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。CART使用基尼系数来代替信息增益比(可以做为熵模型的一个近似替代)。建立二叉树,而不是多叉树(每次仅仅对某个特征的值进行二分,而不是多分)。同样将连续的特征离散化。样本输出是离散值,就是一颗分类树。如果果样本输出是连续值,就是一颗回归树。采用的办法是后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的CART树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。
缺点:
选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。
对异常值比较敏感。
构建的树可能会比较复杂,容易出现过拟合现象,需要进行剪枝处理。
1.3.4 CHAID
基于卡方检验进行特征选择。通常采用预剪枝方法。预剪枝是在树的生长过程中提前停止分裂,以防止过拟合。
缺点:
计算卡方统计量和进行假设检验相对复杂,当数据量较大时,计算成本较高。对于连续型变量要先进行离散化才能应用卡方检验。
1.4 剪枝
对于决策树而言,当不断向下划分,以构建一棵足够大的决策树时(直到所有叶子结点熵值均为0),理论上就能将近乎所有数据全部区分开。所以,决策树的过拟合风险非常大。为此,需要对其进行剪枝处理。
常用的剪枝策略主要有两个:
预剪枝:构建决策树的同时进行剪枝处理(更常用)。预剪枝策略可以通过限制树的深度、叶子结点个数、叶子结点含样本数以及最低信息增益来完成。
后剪枝:构建决策树后再进行剪枝处理。后剪枝法,即先生成决策树,然后产生所有可能的剪枝后的树,然后使用交叉验证来检验各种剪枝的效果,选择泛化能力最好的剪枝策略。
# 1 决策树分类
dt = DecisionTreeClassifier(criterion='gini', # 分裂标准:'gini'(基尼系数)或 'entropy'(信息熵)max_depth=5, # 树的最大深度(防止过拟合)random_state=42 # 随机种子(确保结果可复现)
)
2、随机森林
解决决策树泛化能力弱的特点。随机森林是一种基于树模型的Bagging(自助聚合)的优化版本,一棵树的生成肯定还是不如多棵树,因此就有了随机森林。
决策过程:
1随机选择样本(放回抽样,行抽样。从样本集中通过重采样的方式产生n个样本)。
2构建决策树(假设样本特征数目为a,对n个样本选择a中的k个特征,用建立决策树的方式获得最佳分割点)。
3随机选择特征(列抽样,重复m次,产生m棵决策树)。
4随机森林投票(平均,多数投票机制来进行预测)。
优点:
无需修剪决策树;
过拟合不是问题;
对训练数据中的异常值不太敏感;
能够处理很高维度(feature很多)的数据,并且不用做特征选择(因为特征子集是随机选择的);
训练速度快,容易做成并行化方法(训练时树与树之间是相互独立的);
对于不平衡的数据集来说,它可以平衡误差;
如果有很大一部分的特征遗失,仍可以维持准确度。
缺点:
回归无法预测训练数据范围外的值;
在回归中,经常无法准确预测极端值–低估了高点,高估了低点。
# 2. 随机森林分类
rf = RandomForestClassifier(n_estimators=100, # 决策树的数量criterion='gini', # 分裂标准max_depth=5, # 单棵树的最大深度random_state=42 # 随机种子
)
3、梯度提升树
一种基于集成学习的算法,旨在通过组合多个弱学习器来构建一个强学习器。其核心思想是逐步优化模型,通过每一步的学习来纠正前一步的错误。弱学习器是指在某一特定任务上表现稍好的模型。通常,单个弱学习器的预测能力有限,但通过集成多个弱学习器,可以显著提高整体模型的性能。最终模型是初始模型与所有弱学习器的加权和。残差反映了模型在当前阶段的预测误差。新树的目标是捕捉当前模型未能解释的部分。
随机森林 VS 梯度提升树
随机森林:
并行构建:多棵决策树独立构建,互不影响,适合并行化处理。
随机性:每棵树使用不同的随机子样本和随机特征子集,增加模型多样性。
目标:通过“多数投票”(分类)或“平均值”(回归)组合结果,降低方差,提高泛化能力。
复杂度较低:训练过程简单,适合并行化,训练时间通常较快,尤其是在多核处理器上。
梯度提升树:
序贯构建:每棵树在前一棵树的基础上优化,目标是修正前一棵树的残差。
优化目标:通过最小化损失函数逐步优化模型,降低偏差,最终得到强预测模型。
复杂度较高:训练过程序贯,无法并行化,训练时间随树的数量增加而显著增加。
# 3. 梯度提升树分类
gb = GradientBoostingClassifier(n_estimators=100, # 树的数量learning_rate=0.1, # 学习率(控制每棵树的贡献)max_depth=3, # 单棵树的最大深度random_state=42
)
4、逻辑回归
逻辑回归,虽然叫做回归,但它却是分类算法。逻辑回归就是解决二分类问题的利器。逻辑回归是广义的线性模型,就是在线性回归基础上加了一个非线性映射。
假设有如下图所示的一个数据集,使用线性回归算法,可以找到大致如黑线的一个线性模型对其进行拟合。对数据集中每一个xi,都能通过模型找到一个yi(预测值)与之对应。获得了预测值,就可以做很多事情,例如:分类。可以对yi进行分段。这就实现了以回归的思路来实现分类。
线性回归有一个很致命的缺陷——对异常值很敏感,如果数据集中出现异常值,拟合出来的线性模型也将出现很大变化,预测出来的结果也将不在那么准确,从而到导致分类错误。逻辑回归算法对线性回归对异常数据敏感的不足进行了优化改进。用sigmod函数与线性函数进行复合。
sigmoid函数也叫Logistic函数,函数表达式:
sigmoid函数可以很好地将(-∞,+∞)内的数映射到(0,1)上,于是可以将g(z)≥0.5时将该条数据标记为1类,g(z)<0.5时标记为0类。
# 4. 逻辑回归分类
lr = LogisticRegression(penalty='l2', # 正则化类型:'l1'(Lasso)或 'l2'(Ridge)C=1.0, # 正则化强度的倒数(值越小,正则化越强)solver='lbfgs' # 优化算法(如 'lbfgs', 'saga', 'liblinear')
)
5、支持向量机SVM
将向量映射到一个高维空间里,在这个空间里建立一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
线性:
最优分类平面的条件是使间隔最大化。通过任一类(星形或圆形标志)与超平面距离最近的点,基于其与超平面距离的最大化来判定最优超平面,这个距离称为边距(Margin)。相比较于A、B,超平面C的边距最大,且具有鲁棒性,也就是说与任一类别的边距都最大,而不像A、B泛化性较差。
非线性:
需要让空间从原本的线性空间变成一个更高维的空间,在这个高维的线性空间下,再用一个超平面进行划分。
SVM有一种称为核函数的技术。这些函数采用低维输入空间并将其转换为更高维空间,即将不可分离问题转换为可分离问题,这些函数称为内核。它主要用于非线性分离问题。
# 5. 支持向量机 (SVM)
svm = SVC(kernel='rbf', # 核函数:'linear', 'poly', 'rbf', 'sigmoid'C=1.0, # 正则化参数(值越大,对误分类容忍度越低)gamma='scale' # 核函数的系数('scale' 或 'auto')
)
6、KNN
找出挨着自己最近的K个邻居,并且根据邻居的类别来确定自己的类别情况。
比如红色点,挨着其最近的5个点(K=5时)如上图,如果该5个点中多数均为A类,那么红色点就归为A类。k近邻的三个要素:①距离度量,②k(邻居数)的选择,③分类决策规则。
距离度量可以是一般的L_p距离(或Minkowski、闵可夫斯基、闵氏距离)。通常情况下K值为奇数,通常建议介于3~20之间。分类决策规则一般用多数表决规则。
缺点:KNN是一种“懒惰学习”算法(Lazy Learning),在训练阶段几乎不进行任何计算,而是将所有数据存储起来。在预测阶段,需要对每个测试样本计算其与所有训练样本之间的距离,然后找到最近的K个邻居。因此,当数据量较大时,计算成本非常高。
影响:在大规模数据集上,KNN的预测速度会非常慢,不适合实时或在线预测场景。
噪声数据:KNN对噪声数据和异常值非常敏感,因为这些数据点可能会影响最近邻的判断。
数据不平衡:在类别不平衡的数据集中,KNN的性能可能会受到严重影响。少数类的样本可能被多数类的样本“淹没”,导致分类错误。
# 6. K近邻分类 (KNN)
knn = KNeighborsClassifier(n_neighbors=5, # 使用的邻居数量weights='uniform' # 权重计算方式:'uniform' 或 'distance'
)
7、朴素贝叶斯
利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概率的类作为该特征所属的类。它的优点是简单高效,尤其适用于特征维度较高的数据集。
之所以称之为”朴素”,是因为贝叶斯分类只做最原始、最简单的假设:所有的特征之间是统计独立的。
在scikit-learn中,一共有3个朴素贝叶斯的分类算法:
GaussianNB:先验为高斯分布(正态分布)的朴素贝叶斯,假设每个标签的数据都服从简单的正态分布。
MultinomialNB:先验为多项式分布的朴素贝叶斯。它假设特征是由一个简单多项式分布生成的。多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征。
BernoulliNB:先验为伯努利分布的朴素贝叶斯。
# 7. 朴素贝叶斯分类
nb = GaussianNB() # 默认使用高斯分布
总结:
如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。
如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适(常用于文本分类)。
如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
8、多层感知机
是一种前馈神经网络模型,它由一个输入层、一个输出层以及至少一层隐藏层组成。多层感知器模型即为多个单层感知器的叠加。
# 8. 多层感知机 (MLP)
mlp = MLPClassifier(hidden_layer_sizes=(100,), # 隐藏层结构(如 (100, 50) 表示两层)activation='relu', # 激活函数:'relu', 'tanh', 'logistic'solver='adam', # 优化算法:'adam', 'lbfgs', 'sgd'max_iter=1000, # 最大迭代次数random_state=42
)
工作原理:
- 前向传播:输入数据通过网络从输入层传递到输出层,在每一层中,数据都被转换为新的表示形式。
- 损失计算:根据输出层产生的预测值和实际目标值之间的差异来计算损失(或误差)。
- 反向传播:使用梯度下降法(或其变体)来更新网络中的权重和偏置,以便最小化损失函数。
9、Unified Classification统一分类
旨在通过一个统一的模型或框架来解决多种分类问题,而不是为每个任务单独设计模型。
百度构建了“任务架构统一、通用能力共享”的通用文本分类技术UTC,其实现了良好的零/少样本迁移性能。PaddleNLP结合文心ERNIE,基于UTC技术开源了首个面向通用文本分类的产业级技术方案。
对于简单任务,通过调用 paddlenlp.Taskflow API,仅用三行代码即可实现零样本(Zero-shot)通用文本分类,可支持情感分析、意图识别、语义匹配、蕴含推理等各种可转换为分类问题的NLU任务。对于复杂任务,可以标注少量数据(Few-shot)进行模型训练,以进一步提升模型分类效果。
UTC具有低资源迁移能力,可以支持通用分类、评论情感分析、语义相似度计算、蕴含推理、多项式阅读理解等多种“泛分类”任务。这使得开发者可以更加轻松高效地实现多任务文本分类数据标注、训练、调优和上线,从而降低文本分类技术门槛。
Github:
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/paddlenlp/taskflow/zero_shot_text_classification.py
参考文章:https://aistudio.csdn.net/644b39106beb9e262918b1cb.html
流程:
1、数据
安装Label Studio为数据打标签、导出JSON文件。通过label_studio.py脚本可转为UTC的数据格式。生成训练/验证集文件。
2、模型微调与评估
推荐使用PromptTrainer API对模型进行微调,该API封装了提示定义功能,且继承自Trainer API。只需输入模型、数据集等就可以使用Trainer API高效快速地进行预训练、微调等任务,可以一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能,Trainer API还针对训练过程的通用训练配置做了封装,比如:优化器、学习率调度等。
3、预测
paddlenlp.Taskflow装载定制模型,通过task_path指定模型权重文件的路径,路径下需要包含训练好的模型权重文件model_state.pdparams。
from pprint import pprint
from paddlenlp import Taskflow
schema = ["病情诊断", "治疗方案", "病因分析", "指标解读", "就医建议", "疾病表述", "后果表述", "注意事项", "功效作用", "医疗费用", "其他"]
my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='/home/aistudio/checkpoint/model_best/plm')
pprint(my_cls(["老年斑为什么都长在面部和手背上","老成都市哪家内痔医院比较好怎么样最好?","中性粒细胞比率偏低"]))
10、比较总结
在选择合适的分类算法时,需要综合考虑数据的规模、特征维度、任务复杂度以及计算资源等因素。
场景需求 | 推荐模型 |
---|---|
线性可分、概率解释 | 逻辑回归 |
高维稀疏、小样本 | 朴素贝叶斯、SVM |
非线性、可解释性 | 决策树、随机森林 |
复杂非线性、高精度 | 梯度提升树、多层感知机 |
局部模式、小数据集 | KNN |
多模态/序列数据、大规模任务 | 统一大模型 |
实时预测、轻量级部署 | 逻辑回归、轻量决策树 |
11、完整代码
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score# 导入数据集
iris = datasets.load_iris()
# 切分数据集,将数据的内容余目标切分成训练集和测试集
Xtrain, Xtest, ytrain, ytest = train_test_split(iris.data,iris.target,random_state=12)# 1. 决策树分类
dt = DecisionTreeClassifier(criterion='gini', # 分裂标准:'gini'(基尼系数)或 'entropy'(信息熵)max_depth=5, # 树的最大深度(防止过拟合)random_state=42 # 随机种子(确保结果可复现)
)# 2. 随机森林分类
rf = RandomForestClassifier(n_estimators=100, # 决策树的数量criterion='gini', # 分裂标准max_depth=5, # 单棵树的最大深度random_state=42 # 随机种子
)# 3. 梯度提升树分类
gb = GradientBoostingClassifier(n_estimators=100, # 树的数量learning_rate=0.1, # 学习率(控制每棵树的贡献)max_depth=3, # 单棵树的最大深度random_state=42
)# 4. 逻辑回归分类
lr = LogisticRegression(penalty='l2', # 正则化类型:'l1'(Lasso)或 'l2'(Ridge)C=1.0, # 正则化强度的倒数(值越小,正则化越强)solver='lbfgs' # 优化算法(如 'lbfgs', 'saga', 'liblinear')
)# 5. 支持向量机 (SVM)
svm = SVC(kernel='rbf', # 核函数:'linear', 'poly', 'rbf', 'sigmoid'C=1.0, # 正则化参数(值越大,对误分类容忍度越低)gamma='scale' # 核函数的系数('scale' 或 'auto')
)# 6. K近邻分类 (KNN)
knn = KNeighborsClassifier(n_neighbors=5, # 使用的邻居数量weights='uniform' # 权重计算方式:'uniform' 或 'distance'
)# 7. 朴素贝叶斯分类
nb = GaussianNB() # 默认使用高斯分布(无需特殊参数)# 8. 多层感知机 (MLP)
mlp = MLPClassifier(hidden_layer_sizes=(100,), # 隐藏层结构(如 (100, 50) 表示两层)activation='relu', # 激活函数:'relu', 'tanh', 'logistic'solver='adam', # 优化算法:'adam', 'lbfgs', 'sgd'max_iter=1000, # 最大迭代次数random_state=42
)# 训练模型(假设已有 X_train, y_train)
models = [dt, rf, gb, lr, svm, knn, nb, mlp]
for model in models:model.fit(Xtrain, ytrain)# 在测试集上执行预测,proba导出的是每个样本属于某类的概率pre_result = model.predict(Xtest) # 预测结果# 测试准确率accuracy_value = accuracy_score(ytest, pre_result)# 打印输出结果print(accuracy_value) # 最后预测准确率
相关文章:
机器学习算法——分类任务
算法: 1、决策树 2、随机森林 3、梯度提升树 4、逻辑回归 5、支持向量机SVM 6、K近邻 KNN 7、朴素贝叶斯 8、多层感知机 9、统一分类 10、比较总结 11、完整代码 1、决策树 1.1 Decision Tree Analysis (C4.5,CART,CHAID)决策树 算法树结构特征选择连续值处理缺失…...
聆听PostgreSQL数据库的使用
参考:(1)零基础入门PostgreSQL教程 (2)菜鸟教程 文章目录 一、PostgreSQL是什么?二、基本使用1.下载2.操作(1)数据库(2)表 一、PostgreSQL是什么?…...
C# 装箱(Boxing)与拆箱(Unboxing)
C# 装箱(Boxing)与拆箱(Unboxing) 在 C# 中,装箱和拆箱是与值类型(如结构体)和引用类型(如类)之间的转换相关的操作。它们是类型系统的一部分,但如果不正确使…...
vue实例
// vue应用通过createApp函数创建一个新的应用实例,相当于根组件 import { createApp } from vue import App from ./App.vue // 在一个vue项目当中,有且只有一个vue的实例对象 const appcreateApp(App) // App:根组件 // 实例必须调用了.mount&am…...
Spring Boot的启动流程
Spring Boot 的启动流程是一个复杂且有序的过程: 创建SpringApplication实例 — 调用run方法 — 启动完成(发布应用启动事件,配置环境,创建ApplicationContext,准备ApplicationContext,刷新ApplicationContext[【创建B…...
springboot整合pagehelper实现mybatis分页
1.依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.0</version></dependency><dependency><groupId>com.github.pagehelper<…...
Qt信号与槽机制
Qt信号与槽机制(Signal and Slot Mechanism)是Qt框架中用于对象间通信的一种机制。信号和槽是Qt的核心特性之一,它们允许对象在特定事件发生时发送信号,并由其他对象通过槽函数进行响应。这种机制不仅简化了对象间的通信&…...
Qt空项目代码解释
一、 背景 创建的是一个 QWidget 项目。 二、main.cpp 1、图片 2、代码解释 (1)QApplication Qt 图形化界面中一定有 QApplication (2)Widget w; 是 QWidget 的子类。 (3)w.show(); 继承父类的显示…...
【Git】版本控制系统Git命令详解
2024.06.06 2024.06.06\ 2024.06.06 Resources 强推:Pro Git - Book (git-scm.com).中文版. 强烈推荐网址:https://learngitbranching.js.org/?localezh_CN. LearnGit Game: 基础(Git 主要命令) Git Commit&#…...
Java【多线程】(2)线程属性与线程安全
目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入(如何自己实现可重入锁) 2.4.4死锁(三种情况) 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…...
浅克隆与深克隆区别
package d12_api_object;public class Test2 {public static void main(String[] args) throws CloneNotSupportedException {//目标:掌握Object类提供的对象克隆方法//1、protected Object clone():对象克隆User u1 new User(1,"min","1120",…...
【计算机网络入门】初学计算机网络(九)
目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…...
数列极限入门习题
数列极限入门习题 lim n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim(12131⋯n1)n1 lim n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...
【决策树】分类属性的选择
文章目录 1.信息增益(ID3)2.信息增益率(C4.5)3.基尼指数(CART)ps.三者对比 实现决策树算法最关键的一点就是如何从所有的特征属性中选择一个最优的属性对样本进行分类,这种最优可以理解为希望划…...
Mysql面试篇笔记:
优化: 1.如何定位慢查询: 首先压测接口,查看那个接口比较慢,可以通过多种工具,比如Skywaking 可以查看各个接口响应时间,查看接口最慢,然后去跟踪接口,查看详细信息&#…...
005-Docker 安装 Redis
Docker 安装 Redis 1.从镜像官网拉取Redis镜像2.创建实例并启动3.测试连接4.设置开机启动 1.从镜像官网拉取Redis镜像 镜像官网地址:https://hub.docker.com执行命令 -- 拉取最新的版本 docker pull redis查看镜像 docker images2.创建实例并启动 先创建好需要的…...
可终身授权的外国工具,不限次数使用!PDF转CAD的软件
最近有不少朋友问我有没有好用的CAD转换工具,今天就来给大家分享两款超实用的小软件,希望能帮到大家。 第一款软件是一款国外开发的,它专门用来把PDF文件转换成CAD格式,特别方便。 这款软件的操作非常简单,打开后无需安…...
GaussDB性能调优技术指南
一、性能调优核心目标 降低响应时间:缩短单次查询或事务的处理时间(如从秒级优化到毫秒级)。 提高吞吐量:支撑更高并发请求(如从千次/秒提升到百万次/秒)。 资源高效利用:减少 CPU、…...
iOS逆向工程专栏 第13篇:iOS动态分析基础
iOS逆向工程专栏 第13篇:iOS动态分析基础 引言 在前面的文章中,我们详细探讨了iOS系统架构、逆向开发环境搭建、Mach-O文件格式分析,以及各种静态分析工具和技术。通过静态分析,我们可以了解应用的结构、类和方法定义,以及基本的控制流程。然而,静态分析也存在明显的局…...
【现代深度学习技术】卷积神经网络03:填充和步幅
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
(链表 删除链表的倒数第N个结点)leetcode 19
设空结点指向head便于插入和删除结点 考虑特殊情况 head结点被删除 a结点仅用来测试长度,找到目标结点的位置 b结点为空结点指向head返回值 cur用来删除目标值(特殊情况 目标值为head 这时curb) 则开始就将cur初始化为b开始遍历 /*** Definition fo…...
初阶数据结构(C语言实现)——3顺序表和链表(2)
2.3 数组相关面试题 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…...
leetcode 138. 随机链表的复制
题目如下 数据范围 这道题十分好,一定要自己写看看再来看别人的答案! 首先复制题目给出的链表,对于每个新生成的node利用名为ri的map记录它们在链表的位置和指针。 接着利用名为rd的map存储每个链表中random对应的位置比如(0,…...
【OpenCV C++】以时间命名存图,自动检查存储目录,若不存在自动创建, 按下空格、回车、Q、S自动存图
文章目录 // 保存图像的函数 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::...
C# OnnxRuntime部署DAMO-YOLO人头检测
目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…...
DDD该怎么去落地实现(4)多对多关系
多对多关系的设计实现 如题,DDD该如何落地呢?前面我通过三期的内容,讲解了DDD落地的关键在于“关系”,也就是通过前面我们对业务的理解先形成领域模型,然后将领域模型的原貌,形成程序代码中的服务、实体、…...
Vue 3 组件库开发实战:打造基础 UI 组件库并发布 - 构建可复用的 Vue 组件资产
引言 欢迎再次回到 Vue 3 + 现代前端工程化 系列技术博客! 在昨天的第六篇博客中,我们深入探索了 Vue 3 Composition API 的进阶应用,通过构建可拖拽看板应用,熟练掌握了自定义 Hook 的代码复用技巧。 今天,我们将迈向 Vue 3 组件化开发的更高阶段,聚焦于 组件库的开发与…...
UNION 和 UNION ALL 的区别:深入解析 SQL 中的合并操作
在 SQL 的世界里,当我们需要合并多个查询结果集时,UNION和UNION ALL是两个常用的操作符。虽然它们的功能看起来相似,但实际上有着重要的区别,这些区别在不同的应用场景中会对查询结果和性能产生显著影响。本文将详细探讨UNION和UN…...
Redis 哈希(Hash)
Redis 哈希(Hash) 概述 Redis 哈希(Hash)是一种特殊的键值对类型,它允许存储结构化的数据,例如一个对象或记录。每个哈希值可以包含多个字段,每个字段又可以存储一个字符串值。这使得Redis哈希非常适合用于存储对象的…...
Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...
7.1.2 计算机网络的分类
文章目录 分布范围交换方式 分布范围 计算机网络按照分布范围可分为局域网、广域网、城域网。局域网的范围在10m~1km,例如校园网,网速高,主要用于共享网络资源,拓扑结构简单,约束少。广域网的范围在100km,例…...
Arcgis中添加脚本工具箱
准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径最后都不要有中文,否则可能报错) 如果…...
【Python 数据结构 1.零基础复习】
目录 一、输入与输出 1.输入 2.格式化输出 二、数字与变量 1.字符串 & 整型 2.字符串 & 整型 & 浮点型 3.变量 练习 2235. 两整数相加 三、运算与操作 1.四则运算 练习 2769. 找出最大的可达成数字 3.取整与取余 练习 2651. 计算列车到站时间 编辑 四、真与假 1…...
颠覆NLP的魔法:深度解读Transformer架构及其核心组件
目录 颠覆NLP的魔法:深度解读Transformer架构及其核心组件 一、Transformer 架构概述 二、核心组件解析 1. Self-Attention(自注意力机制) 2. 位置编码(Positional Encoding) 3. 多头注意力(Multi-Hea…...
【pytest框架源码分析二】pluggy源码分析之add_hookspecs和register
这里我们看一下_manager.py里的类和方法,最主要的是PluginManager类,类的初始化函数如下: class PluginManager:"""Core class which manages registration of plugin objects and 1:N hookcalling.You can register new hoo…...
【leetcode hot 100 53】最大子数组和
解法一:(动态规划)我们用 f(i) 代表以第 i 个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:max{f(i)},f(i)max{f(i−1)nums[i],nums[i]} class Solution {public int maxSubArray(int[] …...
Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接
官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...
009---基于Verilog HDL的单比特信号边沿检测
文章目录 摘要一、边沿检测二、时序逻辑实现2.1 rtl2.2 tb 三、组合逻辑实现3.1 rtl3.2 tb 摘要 文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。 一、边沿检测 边沿检测…...
istio的核心概念简介
Istio 是一个开源的服务网格(Service Mesh)平台,旨在帮助管理、连接、保护和观察分布式微服务架构中的服务。它最初由 Google、IBM 和 Lyft 合作开发,广泛应用于 Kubernetes 环境。Istio 的核心目标是通过提供统一的流量管理、安全…...
如何在Apple不再支持的MacOS上安装Homebrew
手头有一台2012年产的Macbook Pro,系统版本停留在了10.15.7(2020年9月24日发布的)。MacOS 11及后续的版本都无法安装到这台老旧的电脑上。想通过pkg安装Homebrew,发现Homebrew releases里最新的pkg安装包不支持MacOS 10.15.7&…...
@update 的常见用法 Vue.js
在 Vue.js 中,update 是一个事件监听器,通常用于监听自定义组件或某些 Vue 原生组件(如 <input> 或自定义组件)的更新事件。它并不是 Vue 的核心 API,而是一种约定俗成的命名方式,用于处理组件内部状…...
C#开发——日期操作类DateTime
在C#中,日期和时间的操作主要通过 System.DateTime 类来实现。 DateTime 提供了丰富的属性和法,用于处理日期和时间的创建、格式化、比较和计算等操作。以下是一些常用的日期函数和特性: 一、创建日期和时间 1、直接指定日期和时间&…...
大语言模型学习--LangChain
LangChain基本概念 ReAct学习资料 https://zhuanlan.zhihu.com/p/660951271 LangChain官网地址 Introduction | 🦜️🔗 LangChain LangChain是一个基于语言模型开发应用程序的框架。它可以实现以下应用程序: 数据感知:将语言模型…...
Oracle数据库安全防护体系构建与核心技术解析
引言:从某跨国集团数据泄露事件看Oracle防护困局 2025年1月,某跨国零售企业Oracle数据库遭APT组织"暗夜猎手"攻击,攻击者通过三重渗透路径实现数据窃取: 存储层突破:利用Oracle TDE密钥管理漏洞获取wallet…...
iOS UICollectionViewCell 点击事件自动化埋点
iOS 中经常要进行埋点,我们这里支持 UICollectionViewCell. 进行自动化埋点,思路: 通过hook UICollectionViewCell 的setSelected:方法, 则新的方法中执行埋点逻辑,并调用原来的方法 直接上代码 implementation UICol…...
软件工程---基于构件的软件工程
基于构件的软件工程(CBSE)是一种软件开发方法,通过重用现有的软件构件来构建系统,从而提高开发效率和软件质量。这种方法强调软件系统的模块化设计和构建复用,使得软件开发过程更加高效和灵活。 企业软件开发…...
Redis--单线程模型
目录 一、引言 二、Redis单线程模型 三、原因 四、为什么redis是单线程模型,但他的速度这么快? 五、总结 一、引言 本篇文章就Redis为什么是单线程模型做简单介绍。 二、Redis单线程模型 redis只使用一个线程,处理所有的命令请求&#x…...
NodeJS服务器 + Vue3框架 从搭建服务器 定义接口 到请求数据页面展示
NodeJS服务器 Vue3框架全栈开发 后端项目初始化项目安装express创建服务器server.js启动服务验证服务是否启动成功 前端项目新建vue3项目安装axios启动前端项目启动时报错问题解决 vue页面使用axios调用node接口完整代码页面效果图跨域问题解决 本篇文章主要介绍使用Node.js和…...
3.1、密码学基础
目录 密码学概念与法律密码安全分析密码体制分类 - 私钥密码/对称密码体制密码体制分类 - 公钥密码/非对称密码体制密码体制分类 - 混合密码体制 密码学概念与法律 密码学主要是由密码编码以及密码分析两个部分组成,密码编码就是加密,密码分析就是把我们…...
iOS接入Flutter项目
首先要把iOS项目和flutter项目统一目录下,而且需要注意的是flutter是module。 第一步:Flutter相关内容的创建 module创建命令: flutter create --templatemodule my_flutter,之后再执行 flutter pub get flutter build ios …...