机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)

news2025/7/19 12:17:55

朴素贝叶斯模型

贝叶斯定理:

常见类型

算法流程

优缺点

集成学习算法

基本原理

常见方法

 KNN(聚类模型)

算法性质:

核心原理:

算法流程

优缺点

matlab中的运用


朴素贝叶斯模型

朴素贝叶斯模型是基于贝叶斯定理与特征条件独立假设的分类方法,在众多领域有广泛应用。

贝叶斯定理

贝叶斯定理解决的核心问题是,当出现新的信息或证据时,如何修正对某个事件发生概率的原有认知。它提供了一种基于先验知识和新证据来更新概率的方法,体现了概率推理的动态过程。

特征条件独立假设:假设给定类别下各个特征之间相互独立。

常见类型

高斯朴素贝叶斯:适用于特征变量为连续型数据,且这些数据服从高斯分布(正态分布)的情况。例如,在根据身高、体重等连续特征判断人的性别时,可假设这些特征在男性和女性群体中分别服从不同参数的高斯分布。

多项式朴素贝叶斯:常用于文本分类等场景,特征变量通常是离散的计数数据。比如在判断一篇文档是否属于某一主题时,以单词在文档中出现的次数作为特征,这些特征符合多项式分布。

伯努利朴素贝叶斯:适用于特征为二值变量的情况,即特征只有两种取值,如真 / 假、是 / 否等。例如在判断邮件是否为垃圾邮件时,可将邮件中某特定关键词的出现(是 / 否)作为二值特征。

算法流程

数据准备:收集数据并进行预处理,包括数据清洗、特征提取等。例如在文本分类中,需要对文本进行分词、去除停用词等操作。

计算先验概率:统计每个类别在训练数据集中出现的频率P(C),作为先验概率。比如在垃圾邮件分类中,统计垃圾邮件和正常邮件在训练集中所占的比例。

计算似然概率:根据特征条件独立假设,计算每个特征在不同类别下的条件概率

。例如在判断一封邮件是否为垃圾邮件时,计算某个关键词在垃圾邮件和正常邮件中出现的概率。

预测:对于新的样本,根据贝叶斯定理计算每个类别下的后验概率

,选择后验概率最大的类别作为预测结果。

,由于

对所有类别相同,所以只需比较分子部分。

优缺点

优点

算法简单高效:基于简单的概率计算,训练和预测速度快,对大规模数据集有较好的适应性。

所需数据量少:在数据较少的情况下仍能表现出较好的性能,且对数据的缺失值不太敏感。

可解释性强:通过计算概率来进行分类决策,结果相对容易理解,可解释每个类别预测的依据。

缺点

特征独立性假设强:实际应用中,特征之间往往存在一定相关性,这可能导致模型性能下降。例如在文本中,某些词汇可能存在语义关联,并不完全独立。

对输入数据的表达形式敏感:不同的特征表示方式可能会对模型效果产生较大影响,如文本分类中不同的分词方法。

集成学习算法

一种机器学习范式,它通过组合多个基学习器(Base Learner)来创建一个更强大、更稳健的模型,以提高模型的泛化能力和预测性能。以下从其原理、常见方法、应用场景、优缺点展开介绍:

基本原理

集成学习的核心思想基于 “三个臭皮匠,赛过诸葛亮” 的理念。不同的基学习器可能在处理数据的不同方面或特征上具有优势,通过将它们结合起来,可以互相补充,减少单一模型的偏差和方差,从而提升整体性能。例如,在预测房价的任务中,一个基学习器可能擅长捕捉房屋面积与价格的关系,另一个可能对房屋所在区域的影响把握更准,集成学习能综合二者优势,做出更准确的预测。

常见方法

Bagging(自举汇聚法)

原理:从原始训练数据集中有放回地随机采样,生成多个与原始数据集大小相同的子数据集,每个子数据集用于训练一个基学习器。由于采样的随机性,不同基学习器基于不同的数据子集进行训练,从而引入了多样性。例如,对于一个包含 1000 个样本的原始数据集,每次有放回地抽取 1000 个样本组成子数据集,多次抽取得到多个不同的子数据集。

代表算法:随机森林(Random Forest)是基于 Bagging 的典型算法,它以决策树为基学习器。在构建每棵决策树时,不仅对样本进行有放回采样,还在节点分裂时随机选择特征子集,进一步增加了决策树之间的差异。最终通过投票(分类任务)或平均(回归任务)的方式综合各决策树的结果。

Boosting(提升法)

原理:基学习器按顺序依次训练,每个新的基学习器会重点关注前一个基学习器预测错误的样本,通过不断调整样本权重,使得后续学习器能够更聚焦于难以分类或预测的样本。例如,在初始阶段,所有样本权重相同,当第一个基学习器训练完成后,将预测错误的样本权重增大,这样下一个基学习器在训练时就会更关注这些样本。

代表算法:Adaboost(自适应提升算法)是最早的 Boosting 算法之一,它通过迭代训练多个弱分类器,并为每个弱分类器赋予不同的权重,最终将这些弱分类器线性组合成一个强分类器。另一个重要的算法是梯度提升树(Gradient Boosting Tree,GBT),它以决策树为基学习器,通过不断拟合残差(即真实值与当前模型预测值的差值)来提升模型性能。

 KNN(聚类模型)

算法性质:

K - Means 属于无监督学习算法,旨在将数据集中的样本划分为 K 个不同的簇,使同一簇内样本相似度高,不同簇间样本相似度低。

核心原理:

随机选择 K 个点作为初始聚类中心,然后将每个样本分配到与其距离最近的聚类中心所在的簇。分配完成后,重新计算每个簇的中心(通常是簇内所有样本的均值)。不断重复样本分配和中心更新步骤,直到聚类中心不再变化或达到预设的迭代次数,此时认为聚类收敛。

算法流程

初始化:随机选择 K 个样本点作为初始聚类中心。

分配样本:计算每个样本到 K 个聚类中心的距离,将样本分配到距离最近的聚类中心所在的簇。

更新聚类中心:计算每个簇内样本的均值,以此更新聚类中心位置。

判断收敛:检查聚类中心是否变化,若变化则返回步骤 2 继续迭代;若不变或达到最大迭代次数,则结束算法。

优缺点

优点:原理简单,计算效率高,能快速处理大规模数据集;对处理数值型数据效果较好。

缺点:需事先指定聚类数 K,K 值选择往往依赖经验且可能影响结果;对初始聚类中心敏感,不同初始值可能导致不同聚类结果;对非凸形状的数据分布或存在噪声的数据聚类效果不佳。

matlab中的运用

1,导入数据*注意这里的变量名训练的和预测的名字要一致

2,matlab工具箱->分类学习器(或者classificationLearner)

(如果是回归学习器,就是reegressionLearner)

3,导入数据

有如下的训练方法

4,并行训练即可

5,导出模型就可以进行预测了

6,预测

第五步也可以采用导出代码来预测

在模型导出的时候选择

然后注释函数行,然后赋值trainingData就可以了

trainingData=x            %%%%%%%x为对应的数据

inputTable = trainingData;

predictorNames = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};

predictors = inputTable(:, predictorNames);

response = inputTable.VarName5;

isCategoricalPredictor = [false, false, false, false];

classNames = categorical({'变色鸢尾'; '山鸢尾'; '维吉尼亚鸢尾'});

% 训练分类器

% 以下代码指定所有分类器选项并训练分类器。

template = templateLinear(...

'Learner', 'Logistic', ...

'Lambda', 'auto', ...

'BetaTolerance', 0.0001);

classificationLinear = fitcecoc(...

predictors, ...

response, ...

'Learners', template, ...

'ClassNames', classNames);

% 使用预测函数创建结果结构体

predictorExtractionFcn = @(t) t(:, predictorNames);

classificationLinearPredictFcn = @(x) predict(classificationLinear, x);

trainedClassifier.predictFcn = @(x) classificationLinearPredictFcn(predictorExtractionFcn(x));

% 向结果结构体中添加字段

trainedClassifier.RequiredVariables = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};

trainedClassifier.ClassificationLinear = classificationLinear;

trainedClassifier.About = '此结构体是从分类学习器 R2023a 导出的训练模型。';

trainedClassifier.HowToPredict = sprintf('要对新表 T 进行预测,请使用: \n [yfit,scores] = c.predictFcn(T) \n将 ''c'' 替换为作为此结构体的变量的名称,例如 ''trainedModel''。\n \n表 T 必须包含由以下内容返回的变量: \n c.RequiredVariables \n变量格式(例如矩阵/向量、数据类型)必须与原始训练数据匹配。\n忽略其他变量。\n \n有关详细信息,请参阅 <a href="matlab:helpview(fullfile(docroot, ''stats'', ''stats.map''), ''appclassification_exportmodeltoworkspace'')">How to predict using an exported model</a>。');

% 提取预测变量和响应

% 以下代码将数据处理为合适的形状以训练模型。

%

inputTable = trainingData;

predictorNames = {'VarName1', 'VarName2', 'VarName3', 'VarName4'};

predictors = inputTable(:, predictorNames);

response = inputTable.VarName5;

isCategoricalPredictor = [false, false, false, false];

classNames = categorical({'变色鸢尾'; '山鸢尾'; '维吉尼亚鸢尾'});

% 执行交叉验证

KFolds = 5;

cvp = cvpartition(response, 'KFold', KFolds);

% 将预测初始化为适当的大小

validationPredictions = response;

numObservations = size(predictors, 1);

numClasses = 3;

validationScores = NaN(numObservations, numClasses);

for fold = 1:KFolds

trainingPredictors = predictors(cvp.training(fold), :);

trainingResponse = response(cvp.training(fold), :);

foldIsCategoricalPredictor = isCategoricalPredictor;

% 训练分类器

% 以下代码指定所有分类器选项并训练分类器。

template = templateLinear(...

'Learner', 'Logistic', ...

'Lambda', 'auto', ...

'BetaTolerance', 0.0001);

classificationLinear = fitcecoc(...

trainingPredictors, ...

trainingResponse, ...

'Learners', template, ...

'ClassNames', classNames);

% 使用预测函数创建结果结构体

classificationLinearPredictFcn = @(x) predict(classificationLinear, x);

validationPredictFcn = @(x) classificationLinearPredictFcn(x);

% 向结果结构体中添加字段

% 计算验证预测

validationPredictors = predictors(cvp.test(fold), :);

[foldPredictions, foldScores] = validationPredictFcn(validationPredictors);

% 按原始顺序存储预测

validationPredictions(cvp.test(fold), :) = foldPredictions;

validationScores(cvp.test(fold), :) = foldScores;

end

% 计算验证准确度

correctPredictions = (validationPredictions == response);

isMissing = ismissing(response);

correctPredictions = correctPredictions(~isMissing);

validationAccuracy = sum(correctPredictions)/length(correctPredictions);

决策树的可视化:

figure(1)

view ( trainingModel.ClassificationTree,’Mode’,’graph’)

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

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

相关文章

【赵渝强老师】K8s中Pod探针的HTTPGetAction

在K8s集群中&#xff0c;当Pod处于运行状态时&#xff0c;kubelet通过使用探针&#xff08;Probe&#xff09;对容器的健康状态执行检查和诊断。K8s支持三种不同类型的探针&#xff0c;分别是&#xff1a;livenessProbe&#xff08;存活探针&#xff09;、readinessProbe&#…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

bat批处理删除此电脑左侧及另存为下文档视屏等多余项

发现的一个解决强迫症人士痛点的小方法&#xff0c;自整理为一键批处理&#xff0c;需者自取 他可以一键去掉电脑左侧及另存为下文档视屏等多余项&#xff0c;还界面一个清爽整洁 干干净净&#xff0c;舒服 分享的是bat文件&#xff0c;可以右键编辑查看源代码&#xff0c;绝…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时&#xff0c;除了默认的IndexController能访问&#xff0c;其他路由Controller都访问不到&#xff0c;提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录&#xff08;或子目录&#xff09;中需要…

HarmonyOS:通过(SQLite)关系型数据库实现数据持久化

一、场景介绍 关系型数据库基于SQLite组件&#xff0c;适用于存储包含复杂关系数据的场景&#xff0c;比如一个班级的学生信息&#xff0c;需要包括姓名、学号、各科成绩等&#xff0c;又或者公司的雇员信息&#xff0c;需要包括姓名、工号、职位等&#xff0c;由于数据之间有较…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…

JAVA-快速排序

一、快速排序基本思想 快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a; 任取待排序元素序列中的某元 素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#…

acm培训 part 1(题解)

第一部分的培训为语法糖&#xff0c;stl容器以及复杂度。 题目分析 1.1 Long Loong AtCoder - abc336_a ​​ 这道题的重点在于多个o的输出。在保证前面‘L’ 的输出和后面‘ng’的输出下&#xff0c;输入需要输出的o的数字&#xff0c;来实现需要输出的效果。 代码如下 …

vulfocus/fastjson-cnvd_2017_02833复现

漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库&#xff0c;用于将 Java 对象转换成 JSON 格式&#xff08;序列化&#xff09;&#xff0c;以及将 JSON 字符串转换回 Java 对象&#xff08;反序列化&#xff09;。 fastjson在解析json的过程中,支持使用type字段来指…

Ceisum无人机巡检直播视频投射

接上次的视频投影&#xff0c;Leader告诉我这个视频投影要用在两个地方&#xff0c;一个是我原先写的轨迹回放那里&#xff0c;另一个在无人机起飞后的地图回显&#xff0c;要实时播放无人机拍摄的视频&#xff0c;还要能转镜头&#xff0c;让我把这个也接一下。 我的天&#x…

一句话,我让 AI 帮我做了个 P 图网站!

每到过节&#xff0c;不少小伙伴都会给自己的头像 P 个图&#xff0c;加点儿装饰。 比如圣诞节给自己头上 P 个圣诞帽&#xff0c;国庆节 P 个小红旗等等。这是一类比较简单、需求量却很大的 P 图场景&#xff0c;也有很多现成的网站和小程序&#xff0c;能帮你快速完成这件事…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

Go语言中的值类型和引用类型特点

一、值类型 值类型的数据直接包含值&#xff0c;当它们被赋值给一个新的变量或者作为参数传递给函数时&#xff0c;实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括&#xff1a; 基础类型&#xff1a;int&#xff0c;float64…

Vue2 项目二次封装Axios

引言 在现代前端开发中&#xff0c;HTTP请求管理是构建健壮应用的核心能力之一。Axios作为目前最流行的HTTP客户端库&#xff0c;其灵活性和可扩展性为开发者提供了强大的基础能力。 1. 为什么要二次封装Axios&#xff1f; 1.1 统一项目管理需求 API路径标准化&#xff1a;…

使用Layout三行布局(SemiDesign)

tips&#xff1a;Semi Design网址 &#xff1a;Semi Design 1、安装Semi # 使用 npm npm i douyinfe/semi-ui# 使用 yarn yarn add douyinfe/semi-ui# 使用 pnpm pnpm add douyinfe/semi-ui 2、引入Layout布局 import { Layout } from douyinfe/semi-ui;3、开始实现三行布局…

css命名规范——BEM

目录 引言 BEM是什么? 块Block 元素Element 修饰语Modifier BEM解决了哪些问题? 在流行框架的组件中使用 BEM 格式 实战 认识设计图 如何使用当前的css规范正确命名? 引言 css样式类命名难、太难了,难于上青天,这个和js变量命名还不一样。看看项目中五花八门的样…

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…

(十四)WebGL纹理坐标初识

纹理坐标是 WebGL 中将 2D 图像&#xff08;纹理&#xff09;应用到 3D 物体表面的重要概念。在 WebGL 中&#xff0c;纹理坐标通常使用一个二维坐标系&#xff0c;称为 uv 坐标&#xff0c;它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…

数据统计–图形报表(day11)

Apache ECharts 介绍 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;Apache ECharts 入门案例 Apache Echarts官方…