实验三:分类算法实验
算法实验报告
算法实验报告算法实验报告引言:算法是计算机科学的核心内容之一,它是解决问题的方法和步骤的描述。
算法的设计和分析是计算机科学与工程中的重要研究方向之一。
本实验旨在通过对算法的实际应用和实验验证,深入理解算法的性能和效果。
实验一:排序算法的比较在本实验中,我们将比较三种常见的排序算法:冒泡排序、插入排序和快速排序。
我们将通过对不同规模的随机数组进行排序,并记录每种算法所需的时间和比较次数,以评估它们的性能。
实验结果显示,快速排序是最快的排序算法,其时间复杂度为O(nlogn),比较次数也相对较少。
插入排序的时间复杂度为O(n^2),比较次数较多,但对于小规模的数组排序效果较好。
而冒泡排序的时间复杂度也为O(n^2),但比较次数更多,效率相对较低。
实验二:图的最短路径算法在图的最短路径问题中,我们将比较Dijkstra算法和Floyd-Warshall算法的效率和准确性。
我们将使用一个带权有向图,并计算从一个顶点到其他所有顶点的最短路径。
实验结果表明,Dijkstra算法适用于单源最短路径问题,其时间复杂度为O(V^2),其中V为顶点数。
而Floyd-Warshall算法适用于多源最短路径问题,其时间复杂度为O(V^3)。
两种算法在准确性上没有明显差异,但在处理大规模图时,Floyd-Warshall算法的效率较低。
实验三:动态规划算法动态规划是一种通过将问题分解成子问题并记录子问题的解来解决复杂问题的方法。
在本实验中,我们将比较两种动态规划算法:0-1背包问题和最长公共子序列问题。
实验结果显示,0-1背包问题的动态规划算法可以有效地找到最优解,其时间复杂度为O(nW),其中n为物品个数,W为背包容量。
最长公共子序列问题的动态规划算法可以找到两个序列的最长公共子序列,其时间复杂度为O(mn),其中m和n分别为两个序列的长度。
结论:通过本次实验,我们对不同算法的性能和效果有了更深入的了解。
排序算法中,快速排序是最快且效率最高的;在图的最短路径问题中,Dijkstra算法和Floyd-Warshall算法分别适用于不同的场景;动态规划算法可以解决复杂的问题,并找到最优解。
分类 实验报告
分类实验报告分类实验报告概述:本次实验旨在研究和探索不同分类方法在机器学习中的应用。
通过对比不同分类算法的准确性和效率,我们可以评估它们在不同数据集上的表现,并为实际应用提供指导。
实验设计:1. 数据集选择我们选择了经典的鸢尾花数据集作为实验对象。
该数据集包含150个样本,分为三个不同种类的鸢尾花,每个样本有四个特征。
这个数据集已经被广泛应用于机器学习领域,具有较高的可信度和代表性。
2. 分类算法选择我们选择了三种常见的分类算法进行比较,分别是K近邻算法(K-Nearest Neighbors, KNN)、决策树算法(Decision Tree)和支持向量机算法(Support Vector Machine, SVM)。
这三种算法在实际应用中具有广泛的用途,并且在不同数据集上都有良好的表现。
实验步骤:1. 数据预处理我们首先对数据集进行了预处理,包括数据清洗、特征选择和数据标准化。
这些步骤可以提高分类算法的准确性和鲁棒性。
2. K近邻算法KNN算法是一种基于实例的学习方法,它通过计算待分类样本与训练集中各个样本之间的距离,选择K个最近邻样本进行投票决策。
我们通过调整K的取值,观察算法的准确率和召回率的变化。
3. 决策树算法决策树算法是一种基于树结构的分类方法,它通过对特征进行递归划分,构建一棵树来进行分类决策。
我们通过调整决策树的深度和分裂准则,观察算法的准确率和解释性的变化。
4. 支持向量机算法SVM算法是一种通过在特征空间中构建最优超平面来进行分类的方法。
我们通过调整核函数的选择和正则化参数的取值,观察算法的准确率和泛化能力的变化。
实验结果:经过多次实验和交叉验证,我们得到了以下结果:1. K近邻算法在鸢尾花数据集上的准确率在K=3时达到最高,为97.33%。
随着K值的增大,准确率逐渐下降,但召回率有所提高。
2. 决策树算法在鸢尾花数据集上的准确率在树深度为3时达到最高,为96%。
随着树深度的增加,准确率略微下降,但解释性更好。
人工智能实验报告四
人工智能实验报告四课程实验报告课程名称:人工智能实验项目名称:实验四:分类算法实验专业班级:姓名:学号:实验时间:2021年6月18日实验四:分类算法实验一、实验目的1.了解有关支持向量机的基本原理2.能够使用支持向量机的代码解决分类与回归问题3. 了解图像分类的基本原理二、实验的硬件、软件平台硬件:计算机软件:操作系统:***** 10应用软件:C+ + ,Java或者Matlab三、实验内容支持向量机算法训练分类器:1.训练数据集:见文档“分类数据集.doc”,前150个数据作为训练数据,其他数据作为测试数据,数据中“ + 1”“-1”分别表示正负样本。
2.使用代码中的C-SVC算法和默认参数来训练“分类数据集doc”中所有的数据(包括训练数据和测试数据),统计分类查准率。
3.在2的基础上使用k-折交叉验证思想来训练分类器并统计分类查准率。
4.使用2中的设置在训练数据的基础上学习分类器,将得到的分类器在测试数据上进行分类预测,统计查准率。
5.在4上尝试不同的C值("-c”参数)来调节分类器的性能并绘制查准率曲线。
6.尝试不同的kernel函数("-t”参数)来调节分类器的性能并绘制查准率曲线,对每种kernel函数尝试调节其参数值并评估查准率。
四. 实验操作采用提供的windows版本的libsvm完成实验。
1.文档“分类数据集.doc”改名为trainall.doc,前150组数据保存为train.doc 后120 组保存为test.doc2.使用代码中的C-SVC算法和默认参数来训练“分类数据集.doc” 中所有的数据(包括训练数据和测试数据),统计分类查准率。
用法:svm-scale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename (缺省值:lower =- 1, upper = 1,没有对y进行缩放)按实验要求这个函数直接使用缺省值就行了。
基于深度学习的像分类算法实验报告
基于深度学习的像分类算法实验报告基于深度学习的图像分类算法实验报告一、实验背景随着信息技术的飞速发展,图像数据呈爆炸式增长,如何快速准确地对图像进行分类成为了一个重要的研究课题。
深度学习作为一种强大的机器学习技术,在图像分类任务中取得了显著的成果。
本实验旨在探索基于深度学习的图像分类算法的性能,并对实验结果进行分析和总结。
二、实验目的1、熟悉深度学习框架和相关技术,掌握图像分类算法的基本原理和实现方法。
2、比较不同深度学习模型在图像分类任务中的性能,包括准确率、召回率、F1 值等指标。
3、分析影响图像分类算法性能的因素,如数据预处理、模型架构、超参数设置等。
4、通过实验结果,提出改进图像分类算法性能的方法和建议。
三、实验环境1、硬件环境:_____CPU:_____GPU:_____内存:_____2、软件环境:操作系统:_____深度学习框架:_____编程语言:_____四、数据准备1、数据集选择本实验选择了常用的图像分类数据集_____,该数据集包含了_____个类别,每个类别有_____张图像。
数据集的特点:图像质量_____、类别分布_____、图像大小_____等。
2、数据预处理数据清洗:去除噪声、异常值和重复数据。
图像增强:采用随机旋转、裁剪、翻转等操作增加数据的多样性。
数据归一化:将图像像素值归一化到0, 1区间。
五、模型选择与实现1、模型选择本实验选择了以下几种深度学习模型进行比较:卷积神经网络(CNN):_____深度残差网络(ResNet):_____视觉Transformer(ViT):_____2、模型实现使用所选的深度学习框架搭建模型结构,并定义损失函数和优化器。
对于每个模型,设置不同的超参数,如卷积核大小、层数、学习率等,进行对比实验。
六、实验过程1、训练过程将预处理后的数据集按照一定比例划分为训练集、验证集和测试集。
使用训练集对模型进行训练,记录训练过程中的损失值和准确率。
实验三决策树算法实验实验报告
实验三决策树算法实验实验报告一、引言决策树算法是一种常用的机器学习算法,它通过构建一个决策树模型来解决分类和回归问题。
在本次实验中,我们将使用决策树算法对一个分类问题进行建模,评估算法的性能,并对实验结果进行分析和总结。
二、实验目的1.学习理解决策树算法的基本原理和建模过程。
2. 掌握使用Python编程实现决策树算法。
3.分析决策树算法在不同数据集上的性能表现。
三、实验过程1.数据集介绍2.决策树算法实现我们使用Python编程语言实现了决策树算法。
首先,我们将数据集随机分为训练集和测试集,其中训练集占70%,测试集占30%。
然后,我们使用训练集来构建决策树模型。
在构建决策树时,我们采用了ID3算法,该算法根据信息增益来选择最优的特征进行分割。
最后,我们使用测试集来评估决策树模型的性能,计算并输出准确率和召回率。
3.实验结果与分析我们对实验结果进行了统计和分析。
在本次实验中,决策树算法在测试集上的准确率为0.95,召回率为0.94、这表明决策树模型对于鸢尾花分类问题具有很好的性能。
通过分析决策树模型,我们发现花瓣长度是最重要的特征,它能够很好地区分不同种类的鸢尾花。
四、实验总结通过本次实验,我们学习了决策树算法的基本原理和建模过程,并使用Python实现了决策树算法。
通过实验结果分析,我们发现决策树算法在鸢尾花分类问题上具有很好的性能。
然而,决策树算法也存在一些不足之处,例如容易过拟合和对数据的敏感性较强等。
在实际应用中,可以使用集成学习方法如随机森林来改进决策树算法的性能。
算法设计与分析实验报告
实验一找最大和最小元素与归并分类算法实现(用分治法)一、实验目的1.掌握能用分治法求解的问题应满足的条件;2.加深对分治法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二、实验内容1、找最大和最小元素输入n 个数,找出最大和最小数的问题。
2、归并分类将一个含有n个元素的集合,按非降的次序分类(排序)。
三、实验要求(1)用分治法求解问题(2)上机实现所设计的算法;四、实验过程设计(算法设计过程)1、找最大和最小元素采用分治法,将数组不断划分,进行递归。
递归结束的条件为划分到最后若为一个元素则max和min都是这个元素,若为两个取大值赋给max,小值给min。
否则就继续进行划分,找到两个子问题的最大和最小值后,比较这两个最大值和最小值找到解。
2、归并分类使用分治的策略来将一个待排序的数组分成两个子数组,然后递归地对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。
在合并过程中,比较两个子数组的首个元素,将较小的元素放入辅助数组,并指针向后移动,直到将所有元素都合并到辅助数组中。
五、源代码1、找最大和最小元素#include<iostream>using namespace std;void MAXMIN(int num[], int left, int right, int& fmax, int& fmin); int main() {int n;int left=0, right;int fmax, fmin;int num[100];cout<<"请输入数字个数:";cin >> n;right = n-1;cout << "输入数字:";for (int i = 0; i < n; i++) {cin >> num[i];}MAXMIN(num, left, right, fmax, fmin);cout << "最大值为:";cout << fmax << endl;cout << "最小值为:";cout << fmin << endl;return 0;}void MAXMIN(int num[], int left, int right, int& fmax, int& fmin) { int mid;int lmax, lmin;int rmax, rmin;if (left == right) {fmax = num[left];fmin = num[left];}else if (right - left == 1) {if (num[right] > num[left]) {fmax = num[right];fmin = num[left];}else {fmax = num[left];fmin = num[right];}}else {mid = left + (right - left) / 2;MAXMIN(num, left, mid, lmax, lmin);MAXMIN(num, mid+1, right, rmax, rmin);fmax = max(lmax, rmax);fmin = min(lmin, rmin);}}2、归并分类#include<iostream>using namespace std;int num[100];int n;void merge(int left, int mid, int right) { int a[100];int i, j,k,m;i = left;j = mid+1;k = left;while (i <= mid && j <= right) {if (num[i] < num[j]) {a[k] = num[i++];}else {a[k] = num[j++];}k++;}if (i <= mid) {for (m = i; m <= mid; m++) {a[k++] = num[i++];}}else {for (m = j; m <= right; m++) {a[k++] = num[j++];}}for (i = left; i <= right; i++) { num[i] = a[i];}}void mergesort(int left, int right) { int mid;if (left < right) {mid = left + (right - left) / 2;mergesort(left, mid);mergesort(mid + 1, right);merge(left, mid, right);}}int main() {int left=0,right;int i;cout << "请输入数字个数:";cin >> n;right = n - 1;cout << "输入数字:";for (i = 0; i < n; i++) {cin >> num[i];}mergesort(left,right);for (i = 0; i < n; i++) {cout<< num[i];}return 0;}六、运行结果和算法复杂度分析1、找最大和最小元素图1-1 找最大和最小元素结果算法复杂度为O(logn)2、归并分类图1-2 归并分类结果算法复杂度为O(nlogn)实验二背包问题和最小生成树算法实现(用贪心法)一、实验目的1.掌握能用贪心法求解的问题应满足的条件;2.加深对贪心法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
数据挖掘weka实验报告
数据挖掘weka实验报告数据挖掘Weka实验报告引言:数据挖掘是一门利用统计学、人工智能和机器学习等技术从大量数据中提取有用信息的学科。
Weka是一款强大的数据挖掘工具,它提供了丰富的算法和功能,使得数据挖掘变得更加容易和高效。
本文将对Weka进行实验,探索其在数据挖掘中的应用。
一、数据集选择和预处理在本次实验中,我们选择了一个关于房价的数据集作为实验对象。
该数据集包含了房屋的各种属性,如面积、位置、卧室数量等,以及对应的房价。
首先,我们需要对数据集进行预处理,以便更好地进行数据挖掘。
1. 缺失值处理在数据集中,我们发现了一些缺失值。
为了保证数据的完整性和准确性,我们采用了Weka提供的缺失值处理方法,如删除缺失值、插补缺失值等。
通过比较不同方法的效果,我们选择了最适合数据集的缺失值处理方式。
2. 特征选择数据集中可能存在一些冗余或无关的特征,这些特征对于数据挖掘的结果可能没有太大的贡献。
因此,我们使用Weka中的特征选择算法,如信息增益、卡方检验等,来选择最具有代表性和相关性的特征。
二、数据挖掘算法应用在预处理完成后,我们开始应用各种数据挖掘算法,探索数据集中隐藏的规律和模式。
1. 分类算法我们首先尝试了几种分类算法,如决策树、朴素贝叶斯等。
通过比较不同算法的准确率、召回率和F1值等指标,我们找到了最适合该数据集的分类算法,并对其进行了优化。
2. 聚类算法除了分类算法,我们还尝试了一些聚类算法,如K均值聚类、层次聚类等。
通过可视化聚类结果,我们发现了数据集中的一些簇,从而更好地理解了数据集的结构和分布。
3. 关联规则挖掘关联规则挖掘是一种发现数据集中项集之间关系的方法。
我们使用了Apriori算法来挖掘数据集中的关联规则,并通过支持度和置信度等指标进行评估。
通过发现关联规则,我们可以了解到不同属性之间的相关性和依赖性。
三、实验结果分析通过实验,我们得到了一系列数据挖掘的结果。
根据实验结果,我们可以得出以下结论:1. 分类算法的准确率较高,可以用于预测房价等问题。
数据分类算法实验报告
一、实验背景与目的随着大数据时代的到来,数据挖掘和机器学习技术在各个领域得到了广泛应用。
数据分类作为数据挖掘的基本任务之一,旨在根据数据特征将数据集划分为不同的类别。
本实验旨在通过实际操作,深入了解数据分类算法的基本原理,掌握常用分类算法的实现方法,并评估不同算法的性能。
二、实验环境与工具1. 操作系统:Windows 102. 编程语言:Python3. 数据挖掘库:scikit-learn4. 数据集:鸢尾花数据集(Iris Dataset)三、实验内容与步骤1. 数据预处理首先,使用scikit-learn库中的datasets模块加载鸢尾花数据集。
该数据集包含150个样本,每个样本包含4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及3个类别标签(Setosa、Versicolour、Virginica)。
```pythonfrom sklearn.datasets import load_irisiris = load_iris()X = iris.datay = iris.target```2. 数据划分将数据集划分为训练集和测试集,使用train_test_split函数实现。
```pythonfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3, random_state=42)```3. 分类算法本实验将使用以下三种分类算法进行实验:- K近邻算法(K-Nearest Neighbors,KNN)- 决策树(Decision Tree)- 支持向量机(Support Vector Machine,SVM)1. K近邻算法使用scikit-learn库中的KNeighborsClassifier实现K近邻算法。
(完整版)KNN算法实验报告
KNN 算法实验报告一试验原理K近来邻(k-NearestNeighbor ,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。
该方法的思路是:若是一个样本在特色空间中的 k 个最相似( 即特色空间中最周边 )的样本中的大多数属于某一个种类,那么该样本也属于这个种类。
KNN算法中,所选择的邻居都是已经正确分类的对象。
该方法在定类决策上只依照最周边的一个也许几个样本的种类来决定待分样本所属的种类。
KNN方法诚然从原理上也依赖于极限制理,但在种类决策时,只与极少量的相邻样本相关。
由于 KNN方法主要靠周围有限的周边的样本,而不是靠鉴识类域的方法来确定所属种类的,因此对于类域的交织或重叠很多的待分样本集来说, KNN方法较其他方法更为适合。
KNN算法不但能够用于分类,还可以够用于回归。
经过找出一个样本的 k 个近来邻居,将这些邻居的属性的平均值赋给该样本,就可以获取该样本的属性。
更适用的方法是将不同样距离的邻居对该样本产生的影响恩赐不同样的权值 (weight) ,如权值与距离成正比。
该算法在分类时有个主要的缺乏是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能以致当输入一个新样本时,该样本的 K个邻居中大容量类的样本占多数。
该算法只计算“近来的〞邻居样本,某一类的样本数量很大,那么也许这类样本其实不凑近目标样本,也许这类样本很凑近目标样本。
无论怎样,数量其实不能够影响运行结果。
能够采用权值的方法〔和该样本距离小的邻居权值大〕来改良。
该方法的另一个缺乏之处是计算量较大,由于对每一个待分类的文本都要计算它到全体样本的距离,才能求得它的K个近来邻点。
目前常用的解决方法是早先对样本点进行剪辑,早先去除对分类作用不大的样本。
该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这类算法比较容易产生误分。
二试验步骤那么依照以上的描述,我把结合使用反余弦般配和 kNN 结合的过程分成以下几个步骤:1.计算出样本数据和待分类数据的距离2.为待分类数据选择 k 个与其距离最小的样本3.统计出 k 个样本中大多数样本所属的分类4.这个分类就是待分类数据所属的分类数学表达:目标函数值能够是失散值 (分类问题 ),也能够是连续值(回归问题).函数形势为 f:n 维空间 R—〉一维空间 R。
实验三决策树算法实验实验报告
实验三决策树算法实验一、实验目的:熟悉和掌握决策树的分类原理、实质和过程;掌握典型的学习算法和实现技术。
二、实验原理: 决策树学习和分类.三、实验条件:四、实验内容:1 根据现实生活中的原型自己创建一个简单的决策树。
2 要求用这个决策树能解决实际分类决策问题。
五、实验步骤:1、验证性实验:(1)算法伪代码算法Decision_Tree(data,AttributeName) 输入由离散值属性描述的训练样本集data; 候选属性集合AttributeName。
输出一棵决策树。
(1)创建节点N;(2)If samples 都在同一类C中then (3)返回N作为叶节点,以类C标记;(4)If attribute_list为空then(5)返回N作为叶节点,以samples 中最普遍的类标记;//多数表决(6)选择attribute_list 中具有最高信息增益的属性test_attribute; (7)以test_attribute 标记节点N;(8)For each test_attribute 的已知值v //划分samples ;(9)由节点N分出一个对应test_attribute=v的分支;(10令Sv为samples中test_attribute=v 的样本集合;//一个划分块(11)If Sv为空then(12)加上一个叶节点,以samples中最普遍的类标记;(13)Else 加入一个由Decision_Tree(Sv,attribute_list-test_attribute)返回节点值。
(2)实验数据预处理Age:30岁以下标记为“1”;30岁以上50岁以下标记为“2”;50岁以上标记为“3”。
Sex:FEMAL----“1”;MALE----“2”Region:INNER CITY----“1”;TOWN----“2”; RURAL----“3”; SUBURBAN----“4” Income:5000~2万----“1”;2万~4万----“2”;4万以上----“3” Married Children Car MortgagePep:以上五个条件,若为“是”标记为“1”,若为“否”标记为“2”。
算法实验3-最大子段和问题实验报告
昆明理工大学信息工程与自动化学院学生实验报告( 2011 — 2012 学年 第 1 学期 )课程名称:算法设计与分析 开课实验室:信自楼机房444 2012 年12月 14日一、上机目的及内容1.上机内容给定有n 个整数(可能有负整数)组成的序列(a 1,a 2,…,a n ),求改序列形如∑=jk ka1的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。
2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)分别用蛮力法、分治法和动态规划法设计最大子段和问题的算法; 蛮力法设计原理:利用3个for 的嵌套(实现从第1个数开始计算子段长度为1,2,3…n 的子段和,同理计算出第2个数开始的长度为1,2,3…n-1的子段和,依次类推到第n 个数开始计算的长为1的子段和)和一个if (用来比较大小),将其所有子段的和计算出来并将最大子段和赋值给summax1。
用了3个for 嵌套所以时间复杂性为○(n 3);分治法设计原理:1)、划分:按照平衡子问题的原则,将序列(1a ,2a ,…,na )划分成长度相同的两个字序列(1a ,…,⎣⎦2/n a )和(⎣⎦12/+n a ,…,na )。
2)、求解子问题:对于划分阶段的情况分别的两段可用递归求解,如果最大子段和在两端之间需要分别计算s1=⎣⎦⎣⎦)2/1(max2/n i an ik k≤≤∑=,s2=⎣⎦⎣⎦)2/(max12/n j n ajn k k≤≤∑+=,则s1+s2为最大子段和。
若然只在左边或右边,那就好办了,前者视s1为summax2,后者视s2 o summax2。
3)、合并:比较在划分阶段的3种情况下的最大子段和,取三者之中的较大者为原问题的解。
KNN算法实验报告
KNN算法实验报告一、引言(100字)KNN(K-Nearest Neighbors)算法是一种常用的分类算法,在机器学习领域有广泛的应用。
本实验旨在通过实际案例的运用,探究KNN算法的原理及其在分类问题中的应用效果。
二、实验过程(200字)1.数据准备:从UCI机器学习库中选择合适的数据集,包括特征和目标变量,用于训练和测试KNN分类器。
2.数据预处理:对数据进行必要的处理,包括数据清洗、特征提取和特征归一化等。
3.划分数据集:将数据集分为训练集和测试集,一般采用80%训练集和20%测试集的比例。
4.特征选择:选择合适的特征子集作为输入数据,以避免维度灾难和提高算法的性能。
5.构建模型:使用KNN算法进行模型训练,根据训练集数据计算每个测试样本与训练样本之间的距离,并根据K值确定测试样本的类别。
6.模型评估:使用测试集数据对模型进行评估,包括准确率、召回率和F1值等指标。
7.参数调优:根据评估结果,调整K值和特征选择的相关参数,优化模型的性能。
三、实验结果(300字)本实验选取了UCI机器学习库中的鸢尾花数据集,该数据集包括4个特征变量和1个目标变量,用于分类三种不同种类的鸢尾花。
在数据预处理阶段,对数据进行了清洗和特征提取。
对于缺失值,采用均值填充的方式进行处理;对于离散特征,采用one-hot编码将其转化为连续特征。
同时,还对数据进行了归一化处理,使得各个特征之间的数值范围相同。
然后将数据集分为训练集和测试集,其中80%作为训练集,20%作为测试集。
经过特征选择和模型训练后,将得到的模型应用到测试集上,得到了较好的分类结果。
通过计算准确率、召回率和F1值等指标,可以评估模型的性能。
最后,通过调整K值,并使用交叉验证的方法进行参数选择,进一步优化了模型的性能。
四、实验分析(400字)通过本实验,我们可以得出以下结论:其次,数据预处理是提高模型性能的重要步骤。
对于缺失值和离散特征,需要进行适当的处理,以避免对模型的影响。
分类__实验报告
实验名称:分类实验一、实验目的1. 理解分类的基本概念和方法。
2. 掌握分类算法的实现和应用。
3. 分析不同分类算法的优缺点,提高对分类问题的解决能力。
二、实验内容1. 数据集准备本实验使用鸢尾花(Iris)数据集进行分类实验。
鸢尾花数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和1个类别标签(3种鸢尾花之一)。
2. 分类算法本次实验主要介绍以下分类算法:(1)K最近邻(KNN)(2)支持向量机(SVM)(3)决策树(4)随机森林3. 实验步骤(1)导入数据集使用Python的pandas库读取鸢尾花数据集。
(2)数据预处理对数据进行标准化处理,使不同特征的数值范围一致。
(3)划分训练集和测试集将数据集划分为训练集和测试集,比例分别为7:3。
(4)模型训练使用训练集对KNN、SVM、决策树和随机森林模型进行训练。
(5)模型评估使用测试集对训练好的模型进行评估,计算准确率、召回率、F1值等指标。
(6)结果分析比较不同分类算法的评估指标,分析各算法的优缺点。
三、实验结果与分析1. 数据预处理将鸢尾花数据集的4个特征进行标准化处理,使其数值范围在0到1之间。
2. 划分训练集和测试集将数据集划分为7:3的训练集和测试集。
3. 模型训练与评估(1)KNN设置K值为3,使用训练集训练KNN模型,然后在测试集上进行评估。
准确率为0.9778,召回率为0.9778,F1值为0.9778。
(2)SVM设置SVM的核函数为径向基函数(RBF),C值为1,gamma值为0.001。
使用训练集训练SVM模型,然后在测试集上进行评估。
准确率为0.9778,召回率为0.9778,F1值为0.9778。
(3)决策树设置决策树的深度为3,使用训练集训练决策树模型,然后在测试集上进行评估。
准确率为0.9778,召回率为0.9778,F1值为0.9778。
(4)随机森林设置随机森林的树数量为100,使用训练集训练随机森林模型,然后在测试集上进行评估。
【报告】id3算法实验报告
【关键字】报告id3算法实验报告篇一:ID3算法实验报告一、实验原理决策树通过把实例从根节点排列到某个叶子节点来分类实例,叶子节点即为实例所属的分类。
树上的每一个节点说明了对实例的某个属性的尝试,并且该节点的每一个后继分支对应于该属性的一个可能值,例如下图。
构造好的决策树的关键在于如何选择好的逻辑判断或属性。
对于同样一组例子,可以有很多决策树能符合这组例子。
人们研究出,一般情况下或具有较大概率地说,树越小则树的预测能力越强。
要构造尽可能小的决策树,关键在于选择恰当的逻辑判断或属性。
由于构造最小的树是NP-难问题,因此只能采取用启发式策略选择好的逻辑判断或属性。
用信息增益度量期望熵最低,来选择分类属性。
公式为ID3算法创建树的Root结点如果Examples都为正,那么返回label=+中的单结点Root 如果Examples都为反,那么返回lable=-单结点树Root如果Attributes为空,那么返回单节点树Root,lable=Examples中最普遍的目标属性值否则开始A目标属性值lable=Examples中最普遍的否则在这个新分支下加一个子树ID3(example-vi,target-attribute,attributes-|A|)结束返回Root二、算法实现训练数据存放在Data.txt 中第一行为训练样本数量和每个样本中属性的数量第二行为每个属性取值的数量之后n行为所有样本节点数据结构struct DTNode{int name; //用1,2,3...表示选择的属性,0表示不用分类,即叶节点int data[D_MAX+1]; //表示此节点包含的数据,data[i]=1,表示包含二维数组data[][]中的第i条数据int leaf;//leaf=1 正例叶节点;leaf=2 反例叶节点;leaf=0不是节点int c; //c=1 正类;c=0 反类DTNode *child[P+1];//按属性值的个数建立子树};定义函数void Read_data() //从数据文件Data.txt中读入训练数据DT_pointer Create_DT(DT_pointer Tree,int name,int value)//创建决策树int chose(int *da)//选择分类属性float Gain(int *da,int p) //计算以p属性分类的期望熵float Entropy(int *da) //计算数据的熵int test_leaf(int *da) //尝试节点属性void Out_DT(DT_pointer Tree) //用线性表形式输出建立的决策树int Class(int *da) //对输入的尝试样本分类全局变量FILE *fp;int p_num; //属性的数量int pi[P_MAX+1]; //每个属性有几种取值int d_num;//数据的数量int data[P_MAX+1][D_MAX+1];//存储训练数据三、程序不足1.、默认训练数据是正确的,对是否发生错误不予考虑2、没有考虑训练数据可以包含缺少属性值的实例3、只能分正反两类四、程序源码#include#include#include#include#include#define P_MAX 10#define D_MAX 50#define P 5//一条数据包括所有属性的取值(1,2,3...)和分类的值(0或1)FILE *fp;int p_num; //属性的数量int pi[P_MAX+1]; //每个属性有几种取值int d_num;//数据的数量int data[P_MAX+1][D_MAX+1];//存储训练数据//定义结点类型struct DTNode{int name; //此节点分类属性的名称int data[D_MAX+1]; //表示此节点包含的数据int leaf; //leaf=1 正例叶节点;leaf=2 反例叶节点;叶节点int c; //c=1 正类;c=0 反类DTNode *child[P+1];//按属性值的个数建立子树};typedef struct DTNode *DT_pointer;DT_pointer DT = NULL;int root = 0;int test_leaf(int *da) leaf=0不是int i;int a,b;a = 0;// a=0表示没有0类a=1表示有0类for(i = 1; i { if(*(da+i) ==1 && data[i][0] == 0){a = 1;break;}}b = 0;//b=0表示没有1类b=1表示有1类for(i = 1;i { if(*(da+i) == 1 && data[i][0] == 1){b = 1;break;}}if(a == 0 && b == 1)return 1;//是1叶节点else if(a == 1 && b == 0)return 2;//是0叶节点else if(a == 0 && b == 0)return 2;//此节点无数据elsereturn 0;//不是叶节点}int test_c(int a) //给叶节点附属性值{if(a == 1)return 1;elsereturn 0;}float Entropy(int *da) //计算数据的熵{int i;篇二:ID3算法实验报告装订线:ID3算法分析与实现学院xxxxxxxxxxxxxxxxxxxx 专业xxxxxxxxxxxxxxxx 学号xxxxxxxxxxx 姓名xxxx 指导教师xxxxXX年x月xx日题目ID3算法分析与实现摘要:决策树是对数据进行分类,以此达到预测的目的。
实验项目三:搜索算法
《算法设计与分析》实验报告实验项目(三)搜索算法int main() {int min;cout << "第1 种方案:" << endl;min = pull(3, 7);cout << "第2 种方案:" << endl;if (min > pull(7, 3))cout << "第2 种方案步骤最少。
";else cout << "第1 种方案步骤最少。
";return 0;}运行结果:完成数独求解。
2、用非递归回溯算法.......“数独”是一种智力游戏,一般认为起源于“正交拉丁方”,经日本人推广后风靡全球。
下图是一个数独的示例,需要根据9 ×9 盘面上的已知数字,推理出所有剩余空格的数字,并且满足同一行、同一列、每一个同色九宫内的数字均含1~9 不重复:数独的答案一般都是唯一的,如果有多个可行解也称为无解。
实验要求:gets(str[i]);}for(i=0;i<9;i++){for(j=0;j<9;j++){a[i][j] = str[i][j] - '0';}}backtrack(0);return 0;}运行结果:3、用分支与限界策略求解货物调运问题.......某大型集团公司在全国有m (1 < m≤ 20) 个产品生产基地(通称产地),用A i表示(i = 1, 2, …, m),需要分别将这些物质调运到n (1 < n≤ 20) 个集中消费的地区(通称销地),用B j表示(j = 1, 2, …, n)。
已知这m个产地的产量分别为a1, a2, …, a m(简写为a i),n个销地的销量分别为b1, b2, …, b n(简写为b j),从第i个产地到第j个销地的单位货运价格为c i j,并且总产量和总销量不一定相等。
分类 实验报告
分类实验报告分类实验报告1. 引言在科学研究和实验中,分类是一种常见的方法,用于将事物或现象按照其共同特征或属性进行归类和整理。
分类不仅在自然科学领域中被广泛应用,也在社会科学和人文学科中发挥着重要作用。
本实验报告旨在探讨分类的原理和方法,并通过实验验证其有效性。
2. 实验目的本实验旨在通过对一组物体进行分类,验证分类的可行性和有效性。
通过实验,我们将探索分类的原则和方法,并观察分类对于整理和理解事物的重要性。
3. 实验设计和步骤3.1 实验材料准备我们准备了一组具有不同形状、颜色和大小的物体作为实验材料,包括球体、长方体、圆柱体等。
这些物体具有明显的差异,可以用于分类实验。
3.2 实验步骤(1) 将实验材料摆放在实验台上,确保每个物体都能够清晰可见。
(2) 观察每个物体的形状、颜色和大小等特征,记录在实验记录表中。
(3) 根据物体的特征,将它们进行分类。
可以根据形状、颜色或大小等特征进行分类,也可以综合考虑多个特征进行分类。
(4) 检查每个分类是否合理和准确,如果有需要,可以调整分类方式和标准。
(5) 记录每个分类的结果和理由,并进行总结和分析。
4. 实验结果和分析通过实验,我们对一组物体进行了分类,并记录了每个分类的结果和理由。
根据实验记录表,我们可以看出,分类的准确性和有效性取决于分类的标准和特征选择。
如果我们只根据形状进行分类,可能会出现一些物体难以归类的情况。
但是,如果我们综合考虑形状、颜色和大小等特征,分类的准确性会得到显著提高。
此外,我们还发现分类能够帮助我们更好地理解和组织事物。
通过对物体的分类,我们可以发现它们之间的共同点和差异,进而对它们进行更深入的研究和分析。
分类还可以帮助我们发现事物的规律和趋势,为进一步的研究提供指导和方向。
5. 结论通过本实验,我们验证了分类的可行性和有效性。
分类是一种重要的方法,可以帮助我们整理和理解事物,发现事物之间的关系和规律。
分类的准确性和有效性取决于分类的标准和特征选择。
贝叶斯分类实验报告
贝叶斯分类实验报告贝叶斯分类实验报告引言:贝叶斯分类是一种经典的机器学习算法,它基于贝叶斯定理,通过计算给定特征条件下某个类别的概率来进行分类。
在本次实验中,我们将探索贝叶斯分类算法的原理和应用,并通过实验验证其性能。
一、实验目的本次实验的目的是通过使用贝叶斯分类算法,对一组给定的数据集进行分类,并评估其分类性能。
通过实验,我们希望了解贝叶斯分类算法的原理和优势,以及在实际应用中的效果。
二、实验方法1. 数据集准备:我们从公开数据集中选择了一个包含多个特征和标签的数据集,用于训练和测试贝叶斯分类器。
数据集包含了不同种类的样本,其中每个样本都有一组特征和对应的标签。
2. 数据预处理:在进行分类之前,我们对数据集进行了预处理。
首先,我们对数据进行了清洗,去除了缺失值和异常值。
然后,我们对特征进行了标准化处理,以确保它们具有相似的尺度。
3. 模型训练:我们使用训练集对贝叶斯分类器进行了训练。
在训练过程中,贝叶斯分类器会计算每个类别的先验概率和每个特征在给定类别下的条件概率。
这些概率将用于后续的分类过程。
4. 模型评估:我们使用测试集对训练好的贝叶斯分类器进行了评估。
评估过程中,我们计算了分类器的准确率、精确率、召回率和F1值等指标,以综合评估其性能。
三、实验结果经过实验,我们得到了以下结果:1. 准确率:贝叶斯分类器在测试集上的准确率达到了90%,表明其在分类任务中具有较高的准确性。
2. 精确率和召回率:贝叶斯分类器在不同类别上的精确率和召回率表现较好。
其中,类别A的精确率为85%,召回率为92%;类别B的精确率为92%,召回率为88%。
3. F1值:综合考虑精确率和召回率,我们计算了贝叶斯分类器的F1值。
结果显示,贝叶斯分类器的F1值为0.89,说明其在平衡准确率和召回率方面表现良好。
四、实验讨论本次实验结果表明,贝叶斯分类器在处理多类别分类问题上具有较高的准确性和性能。
然而,我们也注意到一些潜在的局限性和改进空间。
《算法设计与分析》课程实验报告 (分治法(三))
《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。
2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。
设计算法求出A的一个近似中值。
如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。
二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。
三、实验要求(1)写清算法的设计思想。
(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。
(3)根据你的数据结构设计测试数据,并记录实验结果。
(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。
四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY题目实验三:分类算法实验学生姓名蒙寿伟学生学号201408070120专业班级智能科学与技术1401班指导老师袁进日期2017年5月15日一.实验目的1.了解朴素贝叶斯算法和决策树算法的基本原理;2.能够使用朴素贝叶斯算法或者决策树算法对数据进行分类3.学会对于分类器的性能评估方法二、实验的硬件、软件平台 硬件:计算机软件:操作系统:WINDOWS 2000 应用软件:C,Java 或者Matlab三、实验相关知识贝叶斯定理:)()()|()|(P A P B P B A P A B =P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。
P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。
P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。
P(B)是 B 的先验概率,也作标淮化常量(normalizing constant )。
以第一条数据为例:vhigh,vhigh,2,2,small,low,unaccClassValues: unacc, acc, good, vgood 对应P(Bi)。
(i=0,1,2,3)分别算出取其中的最大值,其中,P(A)的值相同,可以不算出来。
If(P(B|A)最大 == 测试样例.ClassValues) return true; Else return false;buying:vhigh,high,med,low.maint:vhigh,high,med,low.doors:2,3,4,5more.Persons:2,4,more.lug_boot:small,med,big.safety:low,med,high.(i=0,1,2,3))()0()0|()|0(P A P B P B A P A B =)()1()1|()|1(P A P B P B A P A B =)()2()2|()|2(P A P B P B A P A B =)()3()3|()|3(P A P B P B A P A B =四、实验内容及步骤实验内容:利用贝叶斯算法或者决策树算法进行数据分类操作数据集:汽车评估数据集(见附录)实验步骤:1.仔细阅读并了解实验数据集;2.使用任何一种熟悉的计算机语言(比如C,Java或者matlab)实现朴素贝叶斯算法或者决策树算法;3.利用朴素贝叶斯算法或者决策树算法在训练数据上学习分类器,训练数据的大小分别设置为:前100个数据,前200个数据,前500个数据,前700个数据,前1000个数据,前1350个数据;4.利用测试数据对学习的分类器进行性能评估;5.统计分析实验结果并上交实验报告;<1>定义和初始化变量<2>统计并计算条件概率P(Ai|Bi),(i=0,1,2,3),当训练数据比较小时会出现Bi等于0的情况,这时P(Ai|Bi)=nan,所以可以加一个判断,当P(Ai|Bi)<0或P(Ai|Bi)>1时,让P(Ai|Bi)=0.<3>计算)() ()|()|(PAP BiPBiAPABi (四个里面取最大)<4>实验结果四、思考题:1. 两种算法在训练数据集和测试数据集上的性能一致吗?哪个比较好?决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。
其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。
所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。
决策树的成功率为: 61.80372% ,贝叶斯成功率为:68.7831% (贝叶斯更好一点)相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。
2. 提出一种提高分类器性能的方法并通过实验验证。
五、实验心得通过这次实验加深了我对朴素贝叶斯的认识,学会了用朴素贝叶斯算法解决具体的问题。
朴素贝叶斯分类是一种十分简单的分类算法,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就觉得此待分类项属于哪个类别。
朴素贝叶斯的原理决定了其成功率不可能太高,但是朴素贝叶斯的简单易用性使得其在一些日常生活中应用广泛。
附件(代码)#include<iostream>#include<cstdlib>#include<cstring>#include<vector>#include<fstream>#include<stdio.h>using namespace std;int countTrain = 0;//训练样本数目int countTest = 0;//测试样本数目int countTestSuc = 0;//测试样本正确的数目int countF=100; //训练和测试的分界string CVname[4]={"unacc","acc","good","vgood"};int ClassValues[4]; //unacc, acc, good, vgoodint buying[4][4]; //vhigh, high, med, low.int maint[4][4]; // vhigh, high, med, low.int doors[4][4]; //2, 3, 4, 5more.int persons[4][4]; //2, 4, more.int lug_boot[4][4]; //small, med, big.int safety[4][4]; //low, med, high.float ClassValuesL[4]; //unacc, acc, good, vgoodfloat buyingL[4][4]; //vhigh, high, med, low.float maintL[4][4]; // vhigh, high, med, low.float doorsL[4][4]; //2, 3, 4, 5more.float personsL[4][4]; //2, 4, more.float lug_bootL[4][4]; //small, med, big.float safetyL[4][4]; //low, med, high.**///统计个数void Tonji(string a,string b,string c,string d,string e,string f,string g){//cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<endl; for(int i=0;i<4;i++)if(g==CVname[i]){ClassValues[i]++;//buying: vhigh, high, med, low.if(a=="vhigh") buying[0][i]++;else if(a=="high") buying[1][i]++;else if(a=="med") buying[2][i]++;else if(a=="low") buying[3][i]++;//maint: vhigh, high, med, low.if(b=="vhigh") maint[0][i]++;else if(b=="high") maint[1][i]++;else if(b=="med") maint[2][i]++;else if(b=="low") maint[3][i]++;//doors: 2, 3, 4, 5more.if(c=="2") doors[0][i]++;else if(c=="3") doors[1][i]++;else if(c=="4") doors[2][i]++;else doors[3][i]++;//persons: 2, 4, more.if(d=="2") persons[0][i]++;else if(d=="4") persons[1][i]++;else persons[2][i]++;//lug_boot: small, med, big.if(e=="small") lug_boot[0][i]++;else if(e=="med") lug_boot[1][i]++;else if(e=="big") lug_boot[2][i]++;//safety: low, med, high.if(f=="low") safety[0][i]++;else if(f=="med") safety[1][i]++;else if(f=="high") safety[2][i]++;break;}}//读取文件void ReadFileTrain(){ifstream fin("CarDatas.txt");string a,b,c,d,e,f,g;int i = countF;while((i--)>0 && fin>>a && fin>>b&& fin>>c && fin>>d && fin>>e && fin>>f && fin>>g){countTrain++;Tonji(a,b,c,d,e,f,g);}fin.close();cout<<"训练样本countTrain="<<countTrain<<endl;}//统计得到在各类别下各个特征属性的条件概率估计void CalAP(){ //概率P(yi)for(int i=0;i<4;i++){ClassValuesL[i] = (float) ClassValues[i]/countTrain;}//特别注意的是P(ai|yi)=ai/0的情况!!!,会使 P(ai|yi)等于nan;for(int i=0;i<4;i++){ //概率P(ai|yi)for(int j=0;j<4;j++){buyingL[i][j] = (float) buying[i][j]/ClassValues[j]; if(buyingL[i][j]<0 || buyingL[i][j]>1) buyingL[i][j]=0;maintL[i][j] = (float) maint[i][j]/ClassValues[j];if(maintL[i][j]<0 || maintL[i][j]>1) maintL[i][j]=0;doorsL[i][j] = (float) doors[i][j]/ClassValues[j];if(doorsL[i][j]<0 || doorsL[i][j]>1) doorsL[i][j]=0;}}for(int i=0;i<3;i++){ //概率P(ai|yi)for(int j=0;j<4;j++){personsL[i][j] = (float) persons[i][j]/ClassValues[j]; if(personsL[i][j]<0 || personsL[i][j]>1) personsL[i][j]=0;lug_bootL[i][j] = (float) lug_boot[i][j]/ClassValues[j];if(lug_bootL[i][j]<0 || lug_bootL[i][j]>1) lug_bootL[i][j]=0;safetyL[i][j] = (float) safety[i][j]/ClassValues[j]; if(safetyL[i][j]<0 || safetyL[i][j]>1) safetyL[i][j]=0;}}}//一行数据的准确与否,P(Bi|A)=P(A|Bi)P(Bi)/P(A),其中P(A)相同,只需比较分子的大小即可bool TestLine(string ai,string bi,string ci,string di,string ei,stringfi,string gi){int b, m, d, p, l, s;//buying:if(ai=="vhigh") b=0;else if(ai=="high") b=1;else if(ai=="med") b=2;else if(ai=="low") b=3;//maint:if(bi=="vhigh") m=0;else if(bi=="high") m=1;else if(bi=="med") m=2;else if(bi=="low") m=3;//doors:if(ci=="2") d=0;else if(ci=="3") d=1;else if(ci=="4") d=2;else d=3;//persons:if(di=="2") p=0;else if(di=="4") p=1;else p=2;//lug_boot:if(ei=="small") l=0;else if(ei=="med") l=1;else if(ei=="big") l=2;//safety:if(fi=="low") s=0;else if(fi=="med") s=1;else if(fi=="high") s=2;float Bi;float MaxB=0;int t=0;//计算四个P(Bi|A)的概率取最大的for(int i=0;i<4;i++){Bi=buyingL[b][i] * maintL[m][i] * doorsL[d][i] * personsL[p][i] * lug_bootL[l][i] * safetyL[s][i] * ClassValuesL[i];if(MaxB < Bi && Bi<=1){MaxB = Bi;t = i;}}//判断预测和事实是否相等if(CVname[t]==gi) return true;else return false;}//读取并测试文件void ReadFileTest(){ifstream fin("CarDatas.txt");string a,b,c,d,e,f,g;bool t=false;int i=0;while(++i && fin>>a && fin>>b&& fin>>c && fin>>d && fin>>e && fin>>f && fin>>g){if(i>countF){countTest++;t=TestLine(a,b,c,d,e,f,g);if(t) countTestSuc++;}}fin.close();}void setZero();int main(){int a[5]={100,200,500,700,1350};for(int i=0;i<5;i++){setZero();countF=a[i]; //训练和测试的分界ReadFileTrain(); //读取文件并且统计个数CalAP(); //计算条件概率ReadFileTest(); //测试样本cout<<"预测正确countTestSuc="<<countTestSuc<<endl;cout<<"测试样本countTest="<<countTest<<endl;cout<<"准确率为:"<<100.0*((float)countTestSuc/(float)countTest)<<"%"<<endl<<endl;}return 0;}void setZero(){countTrain = 0;//训练样本数目countTest = 0;//测试样本数目countTestSuc = 0;//测试样本正确的数目for(int i=0;i<4;i++)for(int j=0;j<4;j++){ClassValues[i]=0; //unacc, acc, good, vgoodbuying[i][j]=0; //vhigh, high, med, low.maint[i][j]=0; // vhigh, high, med, low.doors[i][j]=0; //2, 3, 4, 5more.persons[i][j]=0; //2, 4, more.lug_boot[i][j]=0; //small, med, big.safety[i][j]=0; //low, med, high.ClassValuesL[i]=0; //unacc, acc, good, vgoodbuyingL[i][j]=0; //vhigh, high, med, low.maintL[i][j]=0; // vhigh, high, med, low.doorsL[i][j]=0; //2, 3, 4, 5more.personsL[i][j]=0; //2, 4, more.lug_bootL[i][j]=0; //small, med, big.safetyL[i][j]=0; //low, med, high.}}。