基本算法——分类

目录

创建项目

导入依赖

加载数据

特征选择

学习算法

对新数据分类

评估与预测误差度量

混淆矩阵

通过模型的预测结果生成 ROC 曲线数据

选择分类算法

完整代码

结论


创建项目

首先创建spring boot项目,我这里用的JDK8,springboot2.7.6,在根目录下创建lib文件夹,resources目录下创建data文件夹,将weka.jar放入lib文件夹,将数据文件放到data里面,如图:

导入依赖

在pom中导入依赖

        <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency><dependency><groupId>weka</groupId><artifactId>weka</artifactId><version>3.6.2</version><scope>system</scope><systemPath>${project.basedir}/lib/weka.jar</systemPath></dependency>

同时在build标签下添加如下内容,防止加载不到数据资源:

        <resources><resource><directory>src/main/resources</directory><filtering>true</filtering><includes><include>**/*.*</include></includes></resource><resource><directory>src/main/resources/data</directory><filtering>true</filtering><includes><include>**/*.*</include></includes></resource></resources>

大概在这个位置:

注意这里也修改一下:

在main函数前:

加载数据

        //加载数据//DataSource对象。它可以接受各种文件格式,并将其转换成Instances。ConverterUtils.DataSource ds = new ConverterUtils.DataSource(PATH);Instances data = ds.getDataSet();

我们的任务是学习创建模型,以便预测新样本的animal属性。对于这些新样本,我们只知 道它们的一些其他属性,但不知道它们的animal属性。因此,从训练集中移除animal属性。为 此,只要使用Remove过滤器将animal属性过滤即可。

首先,设置一个参数的字符串表,指定必须移走第一个属性。其余属性用作数据集,用来训 练分类器。

最后,调用Filter.useFilter(Instances, Filter)静态方法,将过滤器应用于所选数 据集。

        // 移除 animal 属性Remove remove = new Remove();remove.setOptions(new String[]{"-R", "1"});remove.setInputFormat(data);data = Filter.useFilter(data, remove);

特征选择

它的目 标是选择相关属性的一个子集,用在学习模型中。为什么特征选择如此重要呢?因为一个更小的 属性集可以简化模型,并且让它们更容易被用户解释,这样通常会减少所需的训练时间,也会降 低过拟合的风险。

做属性选择时,可以考虑类值,也可以不考虑。第一种情况下,可以使用属性选择算法评估 特征的不同子集,并且计算出一个分数,表明所选属性的品质。我们可以使用不同的搜索算法(比 如穷举搜索、最佳优先搜索)与不同的品质分数(比如信息增益、基尼指数等)。

Weka提供了一个AttributeSelection对象进行属性选择,它需要两个额外的参数:评价 器(evaluator),用于计算属性的有用程度;排行器(ranker),用于根据评价者给出的分数对属 性进行分类排序。

        //将把信息增益用作评价器,通过它们的信息增益分数对特征进行分类排序。InfoGainAttributeEval infoGainAttributeEval = new InfoGainAttributeEval();Ranker ranker = new Ranker();//对AttributeSelection对象进行初始化,设置评价器、排行器与数据。AttributeSelection attributeSelection = new AttributeSelection();attributeSelection.setEvaluator(infoGainAttributeEval);attributeSelection.setSearch(ranker);attributeSelection.SelectAttributes(data);//将属性索引数组转换成字符串并打印int[] selectedAttributes = attributeSelection.selectedAttributes();System.out.println(Utils.arrayToString(selectedAttributes));

打印结果如下:12,3,7,2,0,1,8,9,13,4,11,5,15,10,6,14,16

最有价值的属性是12fins)、3eggs)、7aquatic)、2hair)等。基于这个结果,按次序 剔除无用特征,让学习算法生成更准确、更快的学习模型。 那么,“要保留多少个属性”最后是由什么决定的呢?对于确切的数目,没有什么现成的经 验可以借鉴,究竟保留多少属性取决于具体的数据与问题。属性选择的目的是选择那些可以让你 的模型变得更好的属性,所以应该把重点放在考察“属性是否有助于进一步改进模型”上。

学习算法

加载数据并选好最佳特征后,接下来学习一些分类模型。先从最基本的决策树开始。 Weka中,决策树在J48类中实现,它重新实现了著名的Quinlan's C4.5决策树学习器(Quinlan

1993)。 首先,初始化一个新的J48决策树学习器。可以使用一个字符串表传递额外的参数,比如剪 枝(tree pruning),它用来控制模型的复杂度(请参考第1章)。例子中,我们将创建一棵未剪枝 树(un-pruned tree),为此传递一个U参数。

        //构建决策树String[] options = new String[1];options[0] = "-U";J48 j48 = new J48();j48.setOptions(options);//调用buildClassifier(Instances)方法,对学习过程进行初始化。j48.buildClassifier(data);System.out.println(j48);

打印结果如下:

J48 unpruned tree
------------------feathers = false
|   milk = false
|   |   backbone = false
|   |   |   airborne = false
|   |   |   |   predator = false
|   |   |   |   |   legs <= 2: invertebrate (2.0)
|   |   |   |   |   legs > 2: insect (2.0)
|   |   |   |   predator = true: invertebrate (8.0)
|   |   |   airborne = true: insect (6.0)
|   |   backbone = true
|   |   |   fins = false
|   |   |   |   tail = false: amphibian (3.0)
|   |   |   |   tail = true: reptile (6.0/1.0)
|   |   |   fins = true: fish (13.0)
|   milk = true: mammal (41.0)
feathers = true: bird (20.0)Number of Leaves  :     9Size of the tree :     17

从输出结果可以看到,未剪枝树总共有17个节点,其中9个是叶子(Leaves)。 另一种呈现树的方法是利用内建的TreeVisualizer树浏览器

        //构建决策树浏览TreeVisualizer tv = new TreeVisualizer(null, j48.graph(), new PlaceNode2());JFrame frame = new JFrame("Decision Tree Visualization");frame.setSize(800, 500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(tv);frame.setVisible(true);tv.fitToScreen();

决策过程从顶部节点(也叫根节点)开始。节点标签指定要检查的属性值。示例中,先检查 feathers属性的值。如果feathers属性值存在,进入右手分支,到达标记为bird的叶子,表示 有20个样本支持这个输出结果。如果feathers属性值不存在,进入左手分支,到达下一个属性——milk,继续检查milk属性的值,然后进入与属性值相匹配的分支。不断重复这个过程, 直到到达叶节点。

对新数据分类

假如我们有一个动物的属性,但是不知道它的标签,此时可以使用已经学习的分类模型进行 预测。

首先,构造一个特征向量描述新样本,然后,调用模型的classify(Instance)方法获取类值,并返回标签索引:

        //区分一个新的实例double[] vals = new double[data.numAttributes()];vals[0] = 1.0; // hair {false, true}vals[1] = 0.0; // feathers {false, true}vals[2] = 0.0; // eggs {false, true}vals[3] = 1.0; // milk {false, true}vals[4] = 0.0; // airborne {false, true}vals[5] = 0.0; // aquatic {false, true}vals[6] = 0.0; // predator {false, true}vals[7] = 1.0; // toothed {false, true}vals[8] = 1.0; // backbone {false, true}vals[9] = 1.0; // breathes {false, true}vals[10] = 1.0; // venomous {false, true}vals[11] = 0.0; // fins {false, true}vals[12] = 4.0; // legs INTEGER [0,9]vals[13] = 1.0; // tail {false, true}vals[14] = 1.0; // domestic {false, true}vals[15] = 0.0; // catsize {false, true}Instance newInst = new DenseInstance(1.0, vals);newInst.setDataset(data);double label = j48.classifyInstance(newInst);System.out.println(data.classAttribute().value((int)label));

最后输出的结果是mammal类标签。

评估与预测误差度量

虽然创建了模型,但还不知道它是否值得我们信任。为了评估其性能,需要用到交叉验证技术。 Weka提供Evaluation类,帮助我们实现交叉验证。使用时,需要提供模型、数据、折数 (number of folds)以及一个初始的随机种子,评估结果存储在Evaluation对象中。

        //评估Classifier classifier = new J48();Evaluation evaluation = new Evaluation(data);evaluation.crossValidateModel(classifier, data, 10, new Random(1), new Object[]{});System.out.println(evaluation.toSummaryString());

结果如下:

Correctly Classified Instances          93               92.0792 %
Incorrectly Classified Instances         8                7.9208 %
Kappa statistic                          0.8955
Mean absolute error                      0.0225
Root mean squared error                  0.14  
Relative absolute error                 10.2478 %
Root relative squared error             42.4398 %
Coverage of cases (0.95 level)          96.0396 %
Mean rel. region size (0.95 level)      15.4173 %
Total Number of Instances              101     

混淆矩阵

        // 混淆矩阵double[][] confusionMatrix = evaluation.confusionMatrix();System.out.println(evaluation.toMatrixString());

结果如下:

=== Confusion Matrix ===a  b  c  d  e  f  g   <-- classified as41  0  0  0  0  0  0 |  a = mammal0 20  0  0  0  0  0 |  b = bird0  0  3  1  0  1  0 |  c = reptile0  0  0 13  0  0  0 |  d = fish0  0  1  0  3  0  0 |  e = amphibian0  0  0  0  0  5  3 |  f = insect0  0  0  0  0  2  8 |  g = invertebrate

第一行中,第一列的名称对应于分类模型指派的标签。然后,每一个附加行对应于一个实际 为真的类值。比如,第二行对应于那些实际带有mammal类标签的实例。在列中,读取所有被正 确分类为mammals的哺乳动物。第四行“爬行动物”中,可以看到有3个样本被正确分类为 reptile,一个被分类为fish,一个被分类为insect。由此可见,混淆矩阵可以让我们进一步 了解分类模型所犯错误的具体类型。

通过模型的预测结果生成 ROC 曲线数据

        // 绘制 ROC 曲线ThresholdCurve tc = new ThresholdCurve();  // 创建 ThresholdCurve 对象,用于生成 ROC 曲线数据int classIndex = 0;  // 选择要分析的目标类,通常为正类的索引Instances result = tc.getCurve(evaluation.predictions(), classIndex);  // 通过模型的预测结果生成 ROC 曲线数据// 绘制曲线ThresholdVisualizePanel vmc = new ThresholdVisualizePanel();  // 创建 ThresholdVisualizePanel 对象,用于可视化 ROC 曲线vmc.setROCString("(ROC 曲线下面积 = " + tc.getROCArea(result) + ")");  // 设置 ROC 曲线的标签,显示 ROC 曲线下面积vmc.setName(result.relationName());  // 设置曲线的名称,通常为数据集的名称PlotData2D temp = new PlotData2D(result);  // 将生成的 ROC 曲线数据转换为可绘制的数据格式temp.setPlotName(result.relationName());  // 设置绘图的名称temp.addInstanceNumberAttribute();  // 添加实例编号属性,便于后续绘图// 指定哪些点需要连接boolean[] cp = new boolean[result.numInstances()];  // 创建一个布尔数组,用于指定哪些点需要连接for (int n = 1; n < cp.length; n++) {cp[n] = true;  // 将所有点标记为需要连接}temp.setConnectPoints(cp);  // 设置连接点的配置// 添加绘图vmc.addPlot(temp);  // 将生成的曲线数据添加到可视化面板中// 显示曲线JFrame frameRoc = new javax.swing.JFrame("ROC Curve");  // 创建一个 JFrame 窗口,标题为 "ROC Curve"frameRoc.setSize(800, 500);  // 设置窗口大小为 800x500frameRoc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置窗口关闭操作,点击关闭按钮时退出程序frameRoc.getContentPane().add(vmc);  // 将可视化面板添加到窗口中frameRoc.setVisible(true);  // 显示窗口

选择分类算法

机器学习中,朴素贝叶斯是一种最简单、最有效果且最有效率的归纳算法。特征独立(现实 世界中很少有这种情况)时,从理论上来说,这是最好的。即使带有从属特征,它的性能也是非 常好的(Zhang2004)。主要缺点是它不能学习特征之间如何进行相互作用,比如,尽管你喜欢 往茶里放些柠檬或牛奶,可你讨厌同时放入二者。

决策树的主要优点在于,模型是一棵树,它在样本的学习过程中很容易做解释与说明。决策 树既可以处理名义特征,也可以处理数值特征,并且不用担心数据是否是线性可分的。

完整代码

    private static String PATH = ClassUtils.getDefaultClassLoader().getResource("zoo.arff").getPath();public static void main(String[] args) throws Exception {//加载数据//DataSource对象。它可以接受各种文件格式,并将其转换成Instances。ConverterUtils.DataSource ds = new ConverterUtils.DataSource(PATH);Instances data = ds.getDataSet();// 移除 animal 属性Remove remove = new Remove();remove.setOptions(new String[]{"-R", "1"});remove.setInputFormat(data);data = Filter.useFilter(data, remove);//将把信息增益用作评价器,通过它们的信息增益分数对特征进行分类排序。InfoGainAttributeEval infoGainAttributeEval = new InfoGainAttributeEval();Ranker ranker = new Ranker();//对AttributeSelection对象进行初始化,设置评价器、排行器与数据。AttributeSelection attributeSelection = new AttributeSelection();attributeSelection.setEvaluator(infoGainAttributeEval);attributeSelection.setSearch(ranker);attributeSelection.SelectAttributes(data);//将属性索引数组转换成字符串并打印int[] selectedAttributes = attributeSelection.selectedAttributes();System.out.println(Utils.arrayToString(selectedAttributes));//构建决策树String[] options = new String[1];options[0] = "-U";J48 j48 = new J48();j48.setOptions(options);//调用buildClassifier(Instances)方法,对学习过程进行初始化。j48.buildClassifier(data);System.out.println(j48);//区分一个新的实例double[] vals = new double[data.numAttributes()];vals[0] = 1.0; // hair {false, true}vals[1] = 0.0; // feathers {false, true}vals[2] = 0.0; // eggs {false, true}vals[3] = 1.0; // milk {false, true}vals[4] = 0.0; // airborne {false, true}vals[5] = 0.0; // aquatic {false, true}vals[6] = 0.0; // predator {false, true}vals[7] = 1.0; // toothed {false, true}vals[8] = 1.0; // backbone {false, true}vals[9] = 1.0; // breathes {false, true}vals[10] = 1.0; // venomous {false, true}vals[11] = 0.0; // fins {false, true}vals[12] = 4.0; // legs INTEGER [0,9]vals[13] = 1.0; // tail {false, true}vals[14] = 1.0; // domestic {false, true}vals[15] = 0.0; // catsize {false, true}Instance newInst = new DenseInstance(1.0, vals);newInst.setDataset(data);double label = j48.classifyInstance(newInst);System.out.println(data.classAttribute().value((int) label));//构建决策树浏览TreeVisualizer tv = new TreeVisualizer(null, j48.graph(), new PlaceNode2());JFrame frame = new JFrame("Decision Tree Visualization");frame.setSize(800, 500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(tv);frame.setVisible(true);tv.fitToScreen();//评估Classifier classifier = new J48();Evaluation evaluation = new Evaluation(data);evaluation.crossValidateModel(classifier, data, 10, new Random(1), new Object[]{});System.out.println(evaluation.toSummaryString());// 混淆矩阵double[][] confusionMatrix = evaluation.confusionMatrix();System.out.println(evaluation.toMatrixString());// 绘制 ROC 曲线ThresholdCurve tc = new ThresholdCurve();  // 创建 ThresholdCurve 对象,用于生成 ROC 曲线数据int classIndex = 0;  // 选择要分析的目标类,通常为正类的索引Instances result = tc.getCurve(evaluation.predictions(), classIndex);  // 通过模型的预测结果生成 ROC 曲线数据// 绘制曲线ThresholdVisualizePanel vmc = new ThresholdVisualizePanel();  // 创建 ThresholdVisualizePanel 对象,用于可视化 ROC 曲线vmc.setROCString("(ROC 曲线下面积 = " + tc.getROCArea(result) + ")");  // 设置 ROC 曲线的标签,显示 ROC 曲线下面积vmc.setName(result.relationName());  // 设置曲线的名称,通常为数据集的名称PlotData2D temp = new PlotData2D(result);  // 将生成的 ROC 曲线数据转换为可绘制的数据格式temp.setPlotName(result.relationName());  // 设置绘图的名称temp.addInstanceNumberAttribute();  // 添加实例编号属性,便于后续绘图// 指定哪些点需要连接boolean[] cp = new boolean[result.numInstances()];  // 创建一个布尔数组,用于指定哪些点需要连接for (int n = 1; n < cp.length; n++) {cp[n] = true;  // 将所有点标记为需要连接}temp.setConnectPoints(cp);  // 设置连接点的配置// 添加绘图vmc.addPlot(temp);  // 将生成的曲线数据添加到可视化面板中// 显示曲线JFrame frameRoc = new javax.swing.JFrame("ROC Curve");  // 创建一个 JFrame 窗口,标题为 "ROC Curve"frameRoc.setSize(800, 500);  // 设置窗口大小为 800x500frameRoc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  // 设置窗口关闭操作,点击关闭按钮时退出程序frameRoc.getContentPane().add(vmc);  // 将可视化面板添加到窗口中frameRoc.setVisible(true);  // 显示窗口}

结论

总体表现:模型在分类任务上的表现较好,正确分类率高达 92.0792%。

分类效果:在哺乳动物、鸟类、鱼类这三类上,模型的分类效果非常出色,全部正确分类。在爬行动物、两栖动物、昆虫、无脊椎动物这四类上,虽然也表现不错,但存在一些错误分类。

改进方向:可以通过收集更多数据或调整特征选择来进一步提高模型在爬行动物、两栖动物、昆虫、无脊椎动物这四类上的分类效果。

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

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

相关文章

Debian 系统中解决中文日志乱码问题

在 Debian 系统中&#xff0c;打印中文日志时经常会遇到乱码问题。这通常是因为系统的 locale 设置不正确&#xff0c;或者缺少所需的字体支持。本文将详细介绍如何解决此类问题&#xff0c;以确保你的 Debian 系统能够正确显示和处理中文字符。 一 乱码问题 问题描述当你尝试…

【电源专题】LDO关键DC参数——效率

在讲到电源的效率方面,很多时候网上最经常看到的是“LDO的效率低,开关电源效率高,所以LDO需要更大的散热器来帮助耗散热能”。 比如如下所示为网上找到的一些总结,一般也是大家所熟知的: 是的,这描述在一定的使用条件下是正确对的,但并不完全对,因为不同的工作…

传统听写与大模型听写比对

在快节奏的现代生活中&#xff0c;听写技能仍然是学习语言和提升认知能力的重要环节。然而&#xff0c;传统的听写练习往往枯燥乏味&#xff0c;且效率不高。现在&#xff0c;随着人工智能技术的发展&#xff0c;大模型听写工具的问世&#xff0c;为传统听写带来了革命性的变革…

Spring Bean required a single bean, but 2 were found,发现多个 Bean

问题复现 在使用 Autowired 时&#xff0c;不管你是菜鸟级还是专家级的 Spring 使用者&#xff0c;都应该制造或者遭遇过类似的错误&#xff1a; required a single bean, but 2 were found 顾名思义&#xff0c;我们仅需要一个 Bean&#xff0c;但实际却提供了 2 个&#xff…

李宏毅机器学习笔记-Transformer

目录 1. Seq2seq 2. encoder Transformer 中的 Block 结构 3. Decoder 4.Encoder和Decoder间的信息传递 5.Training 6.Tips 1. Seq2seq Transformer 是一个seq2seq的model。Seq2seq指的是input是一个序列&#xff0c;输出也是一个序列&#xff0c;输出的长度是由机器自己…

基于Docker的ETCD分布式集群

目录 1. 说明 2. 配置表 3. 步骤 3.1 放行端口 3.2 docker-compose 文件 3.3 部署到3台服务器 3.4 相关命令 4. 参考 1. 说明 - 以docker容器方式实现ETCD分布式集群&#xff0c;为其他项目提供支持&#xff0c;经过反复试验成功部署(网上资料大都过期或部署失败)。 -…

LeetCode 力扣 热题 100道(二十七)除自身以外数组的乘积(C++)

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂…

DSMM数据安全能力成熟度评估--学习笔记(1)

目录 DSMM是什么&#xff1f; 1、能力成熟度等级评估流程 2、DSMM评估方式&#xff1f; 3、能力成熟度模型使用方法 4、 安全能力维度 4.1 能力构成 4.2 组织建设 4.3 制度流程 4.4 技术工具 4.5 人员能力 5、 能力成熟度等级维度 6、 数据安全过程维度 数据安全能…

【Go】:Sentinel 动态数据源配置指南

前言 在现代微服务架构中&#xff0c;流量控制是确保系统高可用性和稳定性的关键。Sentinel 是一款由阿里巴巴开源的流量控制组件&#xff0c;它不仅支持熔断降级和流量整形&#xff0c;还能通过动态数据源&#xff08;如本地文件或 Nacos&#xff09;加载规则&#xff0c;从而…

STM32学习之通信协议1 USART

时钟特性&#xff0c;比如发送一个波形高电平&#xff0c;然后低电平&#xff0c;接收方怎么知道是1、0还是1、1、0、0 &#xff1f; 这就需要有一个时钟信号来告诉接收方什么时候需要采集数据。时钟特性分为同步和异步。 I2C和SPI有单独的时钟线&#xff0c;所以它们是同步的&…

Arduino 小白的 DIY 空气质量检测仪(3)- TVOC模块、CO2模块

接上回 逐个分析 m_TVOC.h #include <Arduino.h>#include <SoftI2C.h>#include "DFRobot_SGP40.h"// TVOC指数 // 型号&#xff1a;sgp_40 // 接口&#xff1a;VCC->VCC(5V)、GND->GND、SDA->D6、SCL->D7、WAK->GND // 协议&#xff1…

主数据驱动的数据治理框架

目录 数据资产分类 数据治理的重要性 数据质量框架的4个方面 数据治理的核心是加强对数据资产的管控,通过深化数据服务,持续创造价值。数据治 理是在数据资产价值创造的过程中,治理团队对数据资产管理的评价、指导、控制,如下图所示。 数据资产分类 数据资产划分成为主数据…

【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型

1. 背景介绍 虽然现在大模型微调的文章很多&#xff0c;但纸上得来终觉浅&#xff0c;大模型微调的体感还是需要自己亲自上手实操过&#xff0c;才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。 之前微调我们是用两块3090GPU显卡&…

AnnotationConfigApplicationContext流程看实例化的beanPostProcessor

接上一篇https://blog.csdn.net/qq_26437925/article/details/144865082 探究一下beanPostProcessors怎么加进来的 目录 首先register(annotatedClasses);后添加了重要的beanDefinition: ConfigurationClassPostProcessorinvokeBeanFactoryPostProcessors(beanFactory);执行后…

LinuxC高级day4

作业: 1.思维导图 2.终端输入一个C源文件名(.c结尾)判断文件是否有内容&#xff0c;如果没有内容删除文件&#xff0c;如果有内容编译并执行改文件。 3.终端输入两个文件名&#xff0c;判断哪个文件的时间戳更新

RuoYi-Vue从http升级为https(Jar+Nginx)

一、前提条件 1.已通过数字证书管理服务控制台签发证书。 2.SSL证书绑定的域名已完成DNS解析,即域名与主机IP地址相互映射。 附:阿里云网站运维检测平台 3.已在Web服务器开放443端口(HTTPS通信的标准端口)。 如果使用的是阿里云ECS服务器,请确保已经在安全组规则入方向…

OkHttp深度解析:请求流程、分发器机制、拦截器工作及TCP连接复用

目录 一、OkHttp请求的请求流程是怎样的? 二、OkHttp分发器是怎样工作的? 2.1 请求队列与线程池维护 2.2 异步请求处理 2.3 同步请求处理 2.4 请求执行 2.5 请求完成处理&#xff1a; 2.6 线程池设计 三、OkHttp拦截器是如何工作的? 四、应用拦截器和网络拦截器的…

云计算课程报告实验-WordCount算法实验 过程记录

内容描述 本实验指导书通过在华为鲲鹏上&#xff0c;编译运行WordCount程序。完成实验操作后&#xff0c;读者会掌握简单的程序编写&#xff0c;如WordCount中的getWords、countWords、treeMerge。 实验环境 华为鲲鹏云主机、openEuler 20.03操作系统&#xff1b;安装mpich-3…

2018年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题-纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…

kafka使用常见问题

连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…