机器学习算法——集成学习

目录

  • 1. Bagging
    • 1.1 工作流程
    • 1.2 代码实践
  • 2. 随机森林
    • 2.1 工作流程
    • 2.2 代码实践
  • 3. Adaboost
    • 3.1 工作流程
    • 3.2 样本权值的更新策略
    • 3.3 代码实践
  • 4. Stacking
    • 4.1 代码实践
  • 5. Voting
    • 5.1 代码实践
  • 6. 集成学习分类

1. Bagging

Bagging(bootstrap aggregating:自举汇聚法)也叫装袋法,其思想是通过将许多相互独立的学习器的结果进行结合,从而提高整体学习器的泛化能力,是一种并行集成学习方法

1.1 工作流程

  1. 从原始样本集中使用Bootstraping(有放回抽样,这种抽样方法产生的样本子集能很好的反映总体的分布特性)方法抽取n个训练样本,共进行K轮抽取,得到K个训练集(训练集之间相互独立)。
  2. 对于每个训练集,使用相同的数据学习算法(比如决策树、KNN等)独立训练一个基本模型。
  3. 将测试样例输入到所有基本模型中,每个模型都给出一个预测值。对于分类问题:通过投票的方式确定分类结果(每个模型只有一票);对于回归问题:计算预测值的均值作为预测结果。

1.2 代码实践

from sklearn import neighbors
from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt#------------------------------------------------------------------#
# 使用datasets模块导入鸢尾花数据集,并切分特征值和标签值
# train_test_split(x_data, y_data):将数据集划分为测试集和训练集,
# 默认情况下,训练集占3/4,测试集占1/4
#-----------------------------------------------------------------#
iris = datasets.load_iris()
x_data = iris.data[:,:2]
y_data = iris.target
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)
# 利用等高线绘制分类边界图
def plot(model):# 获取数据值所在的范围x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1# 生成网格矩阵元素xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))#-----------------------------------------------------## 预测分类结果# ravel():将多为数据展平为一维数据# np.c_:按列连接两个数组,即拼接成点的坐标的形式# contourf(xx, yy, z):创建填充等高线图,参数需为二维数组#-----------------------------------------------------#z = model.predict(np.c_[xx.ravel(), yy.ravel()])z = z.reshape(xx.shape)cs = plt.contourf(xx, yy, z)
# 创建KNN模型,使用训练集训练模型
knn = neighbors.KNeighborsClassifier()
knn.fit(x_train, y_train)
# 绘制分类边界图
plot(knn)
# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
# 打印准确率
knn.score(x_test, y_test)

在这里插入图片描述

# 创建CART决策树模型,使用训练集训练模型
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)
# 绘制分类边界图
plot(dtree)
# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
# 打印准确率
dtree.score(x_test, y_test)

在这里插入图片描述

# 创建 Bagging 分类器对象,以KNN分类器作为基分类器,创建100个KNN基分类器
bagging_knn = BaggingClassifier(knn, n_estimators=100)
# 模型拟合
bagging_knn.fit(x_train, y_train)
# 绘制分类边界图
plot(bagging_knn)
# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
# 打印准确率
bagging_knn.score(x_test, y_test)

在这里插入图片描述

# 创建 Bagging 分类器对象,以CART决策树分类器作为基分类器,创建100个基分类器
bagging_tree = BaggingClassifier(dtree, n_estimators=100)
# 模型拟合
bagging_tree.fit(x_train, y_train)
# 绘制分类边界图
plot(bagging_tree)
# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)
# 打印准确率
bagging_tree.score(x_test, y_test)

在这里插入图片描述
准确率汇总

算法准确率
KNN73.6 8%
Bagging(KNN)76.32%
DecisionTree57.89%
Bagging(DecisionTree)60.53%

注:由于数据集切分的随机性和Bagging中每个基分类器所使用的训练集不同,因此每次运行的结果可能不同,且Bagging的准确率可能会比单分类器的准确率低

2. 随机森林

随机森林(Random Forest)是通过集成学习的思想将多棵树(基分类器)进行集成的一种算法,它的基本单元是决策树。随机森林=决策树+Bagging+随机属性选择

2.1 工作流程

  1. 样本随机选择:从原始样本集中使用Bootstraping(有放回抽样,这种抽样方法产生的样本子集能很好的反映总体的分布特性)方法抽取n个训练样本,共进行K轮抽取,得到K个训练集(训练集之间相互独立)。
  2. 特征随机选择:当决策树的每个节点需要分裂时,从所有属性 M 中随机选择 K 个属性 (K<<M,这样可以增加随机性,避免过拟合,并提高模型的多样性),然后从这 K 个属性中选择最佳分割属性作为节点的分裂属性,直到满足某个停止条件(例如达到最大深度、节点样本数小于阈值等)。
  3. 重复以上步骤 n 次,建立 n 棵 CART 决策树(决策树形成过程中没有进行剪枝),这 m 棵 CART 决策树形成随机森林。
  4. 通过投票的方式决定数据属于哪一类。

样本和特征的随机选择能很大程度上减少过拟合的风险(决策树容易过拟合),同时也能增强模型的准确性和泛化能力。

随机森林图示
在这里插入图片描述
图中每棵树的样本集合和分支节点的特征均不相同。

2.2 代码实践

from sklearn import tree
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import numpy as np
import matplotlib.pyplot as plt# 载入数据集,划分特征数据与标签数据,并绘制散点图
data = np.genfromtxt("LR-testSet2.txt", delimiter=",")
x_data = data[:,:-1]
y_data = data[:, -1]
plt.scatter(x_data[:,0],x_data[:,1],c=y_data)

在这里插入图片描述

# 将数据集切分为训练集和测试集,比例为1:1
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size = 0.5)# 利用等高线绘制分类边界图
def plot(model):# 获取数据值所在的范围x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1# 生成网格矩阵元素xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))#-----------------------------------------------------## 预测分类结果# ravel():将多为数据展平为一维数据# np.c_:按列连接两个数组,即拼接成点的坐标的形式# contourf(xx, yy, z):创建填充等高线图,参数需为二维数组#-----------------------------------------------------#z = model.predict(np.c_[xx.ravel(), yy.ravel()])z = z.reshape(xx.shape)cs = plt.contourf(xx, yy, z)
# 创建决策树模型,使用训练数据进行拟合
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)# 绘制分类边界图和样本散点图
plot(dtree)
plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test)
dtree.score(x_test, y_test)

在这里插入图片描述

# 创建随机森林模型,其包含50个决策树基分类器
RF = RandomForestClassifier(n_estimators=50)
RF.fit(x_train, y_train)plot(RF)
RF.score(x_test, y_test)

在这里插入图片描述

3. Adaboost

AdaBoost(Adaptive Boosting:自适应增强)的自适应在于:前一个基分类器中被错误分类的样本的权值会增大(将学习器的重点放在容易出错的样本上可以提升学习器的性能),而正确分类的样本的权值会减小,并将样本用来训练下一个基分类器。同时,在每一轮迭代中,加入一个新的基分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器 ,Adaboost是一种串行集成学习方法,基学习器之间存在强依赖关系。
在这里插入图片描述

3.1 工作流程

  1. 初始化训练数据的权值分布,假设有 N 个训练样本,则每一个训练样本最开始时都被赋予相同的权值: w i = 1 N w_i =\frac{1}{N} wi=N1
  2. 训练弱分类器 h i h_i hi,具体训练过程:如果某个训练样本被基分类器 h i h_i hi准确地分类,那么在构造下一个样本集时,它对应的权值要减小;相反,如果某个训练样本被错误分类,那么它的权值要增大。权值更新过的样本集被用于训练下一个基分类器,整个训练过程不断迭代。
  3. 将各个训练得到的弱分类器(基分类器)组合成一个强分类器。各个弱分类器的训练过程结束后,分类误差小的弱分类器的权重较大,使其在最终的分类函数中起着较大的决定作用,分类误差大的弱分类器的权重较小,使其在最终的分类函数中起着较小的决定作用。

3.2 样本权值的更新策略

对于第 t t t轮迭代,基分类器 h h h在训练集 D t D_t Dt上的错误率为 α t \alpha _t αt α t < 0.5 \alpha _t<0.5 αt<0.5)。
则基分类器 h h h的权重更新公式
α t = 1 2 l n 1 − α t α t \alpha _t=\frac{1}{2}ln\frac{1-\alpha _t}{\alpha_t} αt=21lnαt1αt
样本 i i i的权重更新公式
W i t + 1 = W i t e − α t Z t , y = y ^ W_i^{t+1}=\frac{W_i^{t}e^{-\alpha _t}}{Z_t},y=\hat{y} Wit+1=ZtWiteαt,y=y^
W i t + 1 = W i t e α t Z t , y ≠ y ^ W_i^{t+1}=\frac{W_i^{t}e^{\alpha _t}}{Z_t},y\ne\hat{y} Wit+1=ZtWiteαt,y=y^
其中, y y y为真实值, y ^ \hat{y} y^为预测值。样本被正确分类时,权重需减小;样本被错误分类时,权重需增大。 Z t Z_t Zt为归一化因子(更新后的样本权重之和),以保证样本权重之和为1。


样本 x x x最终的预测结果
H ( x ) = s i g m o i d ( ∑ t = 1 T α t h t ( x ) ) H(x)=sigmoid(\sum_{t=1}^T\alpha _th_t(x)) H(x)=sigmoid(t=1Tαtht(x))

3.3 代码实践

import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.metrics import classification_report#-------------------------------------------------------------------------#
# make_gaussian_quantiles:生成具有高斯分布的量化数据
# n_samples:样本数量500个样本,2个样本特征,两个样本特征的均值默认为0
# n_features:每个样本的特征数
# n_classes:数据集的类别数
# mean:指定每个类别的均值
#-------------------------------------------------------------------------#
x1, y1 = make_gaussian_quantiles(n_samples=500, n_features=2, n_classes=2)
x2, y2 = make_gaussian_quantiles(mean=(3, 3), n_samples=500, n_features=2, n_classes=2)# 将两组数据合成一组数据
x_data = np.concatenate((x1, x2))
y_data = np.concatenate((y1, - y2 + 1))# 数据集散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)

在这里插入图片描述

# 创建决策树模型并进行拟合
model = tree.DecisionTreeClassifier(max_depth=3)
model.fit(x_data, y_data)# 获取数据值所在的范围
x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1# 生成网格矩阵元素
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))#--------------------------------------------------------#
# 预测分类结果
# ravel():将多为数据展平为一维数据
# np.c_:按列连接两个数组,即拼接成点的坐标的形式
# contourf(xx, yy, z):创建填充等高线图,参数需为二维数组
#--------------------------------------------------------#
z = model.predict(np.c_[xx.ravel(), yy.ravel()])
z = z.reshape(xx.shape)
cs = plt.contourf(xx, yy, z)# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)# 打印准确率
model.score(x_data,y_data)

在这里插入图片描述

# 创建AdaBoost模型,其包含10个基分类器
model = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators=10)
# 训练模型
model.fit(x_data, y_data)# 获取数据值所在的范围
x_min, x_max = x_data[:, 0].min() - 1, x_data[:, 0].max() + 1
y_min, y_max = x_data[:, 1].min() - 1, x_data[:, 1].max() + 1# 生成网格矩阵元素
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))#--------------------------------------------------------#
# 预测分类结果
# ravel():将多为数据展平为一维数据
# np.c_:按列连接两个数组,即拼接成点的坐标的形式
# contourf(xx, yy, z):创建填充等高线图,参数需为二维数组
#--------------------------------------------------------#
z = model.predict(np.c_[xx.ravel(), yy.ravel()])
z = z.reshape(xx.shape)
cs = plt.contourf(xx, yy, z)# 样本散点图
plt.scatter(x_data[:, 0], x_data[:, 1], c=y_data)# 打印准确率
model.score(x_data,y_data)

在这里插入图片描述
准确率从77.1%增加到98.2%,提升非常大。

4. Stacking

使用多个不同的分类器对训练集进预测,把预测得到的结果作为一个次级分类器的输入。次级分类器的输出是整个模型的预测结果。在Stacking方法中,有两个阶段的模型。 第一个阶段的模型是以原始训练集(无需抽样构造训练集,所有模型均使用相同的训练集)为输入的模型,叫做基模型(也叫 level-0 模型),可以选取多种基模型进行训练。第二个阶段的模型是以基模型在原始训练集上的预测作为训练集,以基模型在原始测试集上的预测作为测试集,叫做元模型(也叫 level-1 模型)1

Stacking算法的结构图示如下
在这里插入图片描述

4.1 代码实践

from sklearn import datasets  
from sklearn import model_selection  
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.tree import DecisionTreeClassifier
# 需安装mlxtend模块:pip install mlxtend
from mlxtend.classifier import StackingClassifier 
import numpy as np  # 载入数据集,只要第1,2列的特征
iris = datasets.load_iris()  
x_data, y_data = iris.data[:, 1:3], iris.target  # 定义三个不同的分类器
clf1 = KNeighborsClassifier(n_neighbors=1)  
clf2 = DecisionTreeClassifier() 
clf3 = LogisticRegression()  # 定义一个次级分类器
lr = LogisticRegression()  
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],   meta_classifier=lr)# zip:用于将多个可迭代对象(例如列表、元组等)的对应元素打包成一个元组,返回一个迭代器
for clf,label in zip([clf1, clf2, clf3, sclf],['KNN','Decision Tree','LogisticRegression','StackingClassifier']):  #------------------------------------------------------------------------------## 在实际使用Stacking方法时,为了避免过拟合的风险,常常伴随着交叉验证操作# 使用3折交叉验证,每次取其中的一份作为测试集,两份作为训练集# 3折交叉验证会输出3个准确率,这里取3个准确率的均值# cross_val_score:计算交叉验证的评分#------------------------------------------------------------------------------#scores = model_selection.cross_val_score(clf, x_data, y_data, cv=3, scoring='accuracy')  print("Accuracy: %0.2f [%s]" % (scores.mean(), label)) 

运行结果

Accuracy: 0.91 [KNN]
Accuracy: 0.93 [Decision Tree]
Accuracy: 0.95 [LogisticRegression]
Accuracy: 0.93 [StackingClassifier]

5. Voting

对基分类器的预测结果使用投票的方式确定最终预测结果。

5.1 代码实践

from sklearn import datasets  
from sklearn import model_selection  
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import train_test_split
import numpy as np# 载入数据集,只要第1,2列的特征(使单个分类器与Voting分类器的准确率之间存在差距,便于观察Voting分类器在准确率上的提升)。
iris = datasets.load_iris()  
x_data, y_data = iris.data[:, 1:3], iris.target  # 定义三个不同的分类器
clf1 = KNeighborsClassifier(n_neighbors=1)  
clf2 = DecisionTreeClassifier() 
clf3 = LogisticRegression()  # 定义Voting分类器
sclf = VotingClassifier([('knn',clf1),('dtree',clf2), ('lr',clf3)])   # zip:用于将多个可迭代对象(例如列表、元组等)的对应元素打包成一个元组,返回一个迭代器
for clf, label in zip([clf1, clf2, clf3, sclf],['KNN','Decision Tree','LogisticRegression','VotingClassifier']):  #------------------------------------------------------------------------------## 为了避免过拟合的风险,使用交叉验证方法# 使用3折交叉验证,每次取其中的一份作为测试集,两份作为训练集# 3折交叉验证会输出3个准确率,这里取3个准确率的均值# cross_val_score:计算交叉验证的评分#------------------------------------------------------------------------------#scores = model_selection.cross_val_score(clf, x_data, y_data, cv=3, scoring='accuracy')  print("Accuracy: %0.2f [%s]" % (scores.mean(), label)) 

运行结果

Accuracy: 0.91 [KNN]
Accuracy: 0.91 [Decision Tree]
Accuracy: 0.95 [LogisticRegression]
Accuracy: 0.95 [VotingClassifier]
# 将数据集划分为训练集和测试集
xtrain, xtest, ytrain, ytest = train_test_split(x_data, y_data, test_size=0.2)# 定义并训练三个不同的分类器
clf1 = KNeighborsClassifier(n_neighbors=1)  
clf1.fit(xtrain, ytrain)
clf2 = DecisionTreeClassifier() 
clf2.fit(xtrain, ytrain)
clf3 = LogisticRegression() 
clf3.fit(xtrain, ytrain)# 定义并训练Voting分类器
sclf = VotingClassifier([('knn',clf1),('dtree',clf2), ('lr',clf3)])   
sclf.fit(xtrain, ytrain)# 实际预测
print("KNN:{}".format(clf1.score(xtest,ytest)))
print("DecisionTree:{}".format(clf2.score(xtest,ytest)))
print("Logistic:{}".format(clf3.score(xtest,ytest)))
print("Voting:{}".format(sclf.score(xtest,ytest)))

运行结果

KNN:0.9
DecisionTree:0.9666666666666667
Logistic:0.9333333333333333
Voting:0.9666666666666667

6. 集成学习分类

按照基分类器的生成方式可分为
在这里插入图片描述

按照是否使用同一种基学习器(使用同一种基学习器的方法称为同质集成方法)可分为
在这里插入图片描述


  1. 集成学习之Stacking(堆栈)方法 ↩︎

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

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

相关文章

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs&#xff0c;定位到DX.23.1: Data 面板&#xff0c;选择Prope…

程序员带你入门人工智能

随着人工智能技术的飞速发展&#xff0c;越来越多的程序员开始关注并学习人工智能。作为程序员&#xff0c;我们可能会对如何开始了解人工智能感到困惑。今天&#xff0c;我将向大家介绍一些如何通过自学了解人工智能的经验和方法&#xff0c;帮助大家更好地入门这个充满挑战和…

Cadence virtuoso drc lvs pex 无法输入

问题描述&#xff1a;在PEX中的PEX options中 Ground node name 无法输入内容。 在save runset的时候也出现无法输入名称的情况 解决办法&#xff1a; copy一个.bashrc文件到自己的工作目录下 打开.bashrc文件 在.bashrc中加一行代码&#xff1a;unset XMODIFIERS 在终端sour…

智慧城市安全监控的新利器

在传统的城市管理中&#xff0c;井盖的监控一直是一个难题&#xff0c;而井盖异动传感器的出现为这一问题提供了有效的解决方案。它具有体积小、重量轻、安装方便等特点&#xff0c;可以灵活地应用于各种类型的井盖&#xff0c;实现对城市基础设施的全方位监控。 智能井盖监测终…

计算机网络学习笔记(六):应用层(待更新)

目录​​​​​​​ 6.2 文件传送协议FTP(File Transfer Protocol) 6.2.1 FTP概述 6.2.2 FTP的基本工作原理 6.5 电子邮件&#xff1a;SMTP、POP3、IMAP 6.5.1 电子邮件概述 6.5.2 发邮件&#xff1a;简单邮件传送协议SMTP 6.5.3 电子邮件的信息格式、地址格式 6.5.4 收…

计算机网络——物理层-信道的极限容量(奈奎斯特公式、香农公式)

目录 介绍 奈氏准则 香农公式 介绍 信号在传输过程中&#xff0c;会受到各种因素的影响。 如图所示&#xff0c;这是一个数字信号。 当它通过实际的信道后&#xff0c;波形会产生失真&#xff1b;当失真不严重时&#xff0c;在输出端还可根据已失真的波形还原出发送的码元…

Docker中快速安装RabbitMQ

文章目录 前言一、安装Docker二、安装RabbitMQ无脑命令行运行 总结 前言 在Ubuntu中的Docker容器中快速安装RabbitMQ&#xff0c;亲测有效&#xff0c;不废话&#xff0c;上操作。 一、安装Docker 直接按照Docker官方教程操作&#xff1a;官方安装教程 点进官网&#xff0c;往…

【win32_001】win32命名规、缩写、窗口

整数类型 bool类型 使用注意&#xff1a; 一般bool 的false0&#xff1b;true1 | 2 | …|n false是为0&#xff0c;true是非零 不建议这样用&#xff1a; if (result TRUE) // Wrong! 因为result不一定只返回1&#xff08;true&#xff09;&#xff0c;当返回2时&#xff0c…

Docker Volume: 实现容器间数据共享与持久化的利器

文章目录 Docker Volume的作用Docker Volume与容器内数据的比较优势劣势 Docker Volume的创建和管理创建Docker Volume管理Docker Volume 演示Docker Volume的挂载Docker Volume的生命周期安全性考虑与Docker Volume应用场景Docker Volume与多容器协作容器迁移与Docker Volume未…

Flask学习一:概述

搭建项目 安装框架 pip install Flask第一个程序 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "Hello World"if __name__ __main__:app.run()怎么说呢&#xff0c;感觉还不错的样子。 调试模式 if __name__ __main__:a…

探索Scrapy中间件:自定义Selenium中间件实例解析

简介 Scrapy是一个强大的Python爬虫框架&#xff0c;可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中&#xff0c;中间件是其重要特性之一&#xff0c;允许开发者在爬取过程中拦截和处理请求与响应&#xff0c;实现个性化的爬虫行为。 本篇博客将深入探讨…

微机原理练习题_13

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1、十六进制数5BF.C8转换成二进制数是(&#xff09; A. 11011100111111101B B. 010111011011.01101B C. 010110111111.11001B D. 010111011011.11001B 2,最适合…

量化交易:建立趋势跟踪策略的五个指标

什么是趋势跟踪策略&#xff1f; 趋势跟踪策略是只需需顺势而为的策略&#xff0c;即在价格上涨时买入&#xff0c;在价格开始下跌时卖出。在趋势跟踪策略中&#xff0c;人们的目标不是预测或预测&#xff0c;而只是关注市场上的任何新兴趋势。 趋势是如何出现的&#xff1f;…

Flume学习笔记(3)—— Flume 自定义组件

前置知识&#xff1a; Flume学习笔记&#xff08;1&#xff09;—— Flume入门-CSDN博客 Flume学习笔记&#xff08;2&#xff09;—— Flume进阶-CSDN博客 Flume 自定义组件 自定义 Interceptor 需求分析&#xff1a;使用 Flume 采集服务器本地日志&#xff0c;需要按照日志…

第十一周任务总结

本周任务总结 本周物联网方面主要继续进行网关的二次开发与规则引擎实现设备联动的实现 非物联网方面主要复习了docker的使用与算法的学习 1.网关的二次开发&#xff0c;本周将实现debug调试输出的文件下载到了网关&#xff0c;但网关出了问题无法连接&#xff0c;最终跟客服…

Libvirt-Qemu-Kvm 操作手记

(持续更新~) 本文主要用于记录在操作libvirt qemu kvm过程中遇到的问题及原因分析。 Hugepage 让qemu使用大页可以减少tdp的size&#xff0c;一定程度上可以提高性能&#xff1b;使用大页可以用memfd或者file backend。 memfd 操作步骤如下&#xff1a; 在系统中reserv…

数据结构 堆

手写堆&#xff0c;而非stl中的堆 如何手写一个堆&#xff1f; //将数组建成堆 <O(n) for (int i n / 2;i;i--) //从n/2开始down down(i); 从n/2元素开始down&#xff0c;最下面一层元素的个数是n/2&#xff0c;其余上面的元素的个数是n/2&#xff0c;从最下面一层到最高层…

electron使用better-sqlite3打包失败(electron打包有进程没有界面)

remove *\chrome_100_percent.pak: Access is denied. 解决&#xff1a; 管理员权限执行&#xff1a;taskkill /IM 你的进程名.exe /F&#xff0c;再次执行build electron使用better-sqlite3打包后有进程没有界面 原因是代码及依赖包安装有误&#xff0c;模块丢失。主要分享的…

Web前端—移动Web第二天(空间转换、动画、综合案例:全名出游)

版本说明 当前版本号[20231118]。 版本修改说明20231118初版 目录 文章目录 版本说明目录移动 Web 第二天01-空间转换空间转换简介平移视距旋转左手法则rotate3d-了解立体呈现案例-3d导航缩放 02-动画动画实现步骤animation复合属性animation拆分写法案例-走马灯精灵动画多组…

每天一道算法题(六)——返回一组数字中所有和为 0 且不重复的三元组

文章目录 前言1、问题2、示例3、解决方法4、效果5、注意点 前言 注意&#xff1a;答案中不可以包含重复的三元组。 1、问题 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] n…