基于maltab数据探索案例——鸢尾花数据集以及算法(3)

三、数据可视化—基于svm机器,决策树聚类,分类训练模型

1.基于SVM数据探索
使用支持向量机(SVM)对鸢尾花数据集进行二分类和多分类分析的过程。通过加载数据集、提取特征、训练SVM模型、绘制散点图和支持向量,我们深入探讨了SVM在解决分类问题中的应用。

%Matlab-2SVM
%支持向量机二分类示例
load fisheriris  %载入鸢尾属植物数据集
inds = ~strcmp(species,'setosa'); %提取不是'setosa'类的数据
X = meas(inds,3:4);  %利用后两个特征(花瓣长度和宽度)
y = species(inds); %剔除'setosa'类后变成二分类问题   
SVM = fitcsvm(X,y),
sv = SVM.SupportVectors; %支持向量
gscatter(X(:,1),X(:,2),y,'br','*p');   %按标签y绘制散点图
hold on
plot(sv(:,1),sv(:,2),'ko','MarkerSize',10); %画出支持向量
legend('versicolor','virginica','Support Vector')
hold off

在这里插入图片描述

图表3- 1svm训练模型
在这里插入图片描述

图表3- 2散点图
使用多分类svm,为了进行多分类分析,我们使用了数据集中的三个类别,并为每个类别训练了一个SVM模型。我们绘制了各类别的分类区域以及观察到的鸢尾花数据点。

%系统fitcsvm做多分类
%支持向量机多分类示例
load fisheriris  %载入Iris数据集
X = meas(:,3:4); %为了可视化, 取数据集的后两个特征
Y = species; %标签
figure (1)
g=gscatter(X(:,1),X(:,2),Y,'mrb','*po'); hold on
a = gca;  %当前坐标轴
lims = [a.XLim a.YLim]; %提取x轴和y轴的极限
title('{鸢尾属植物散点图}');
xlabel('花瓣长度 (cm)');
ylabel('花瓣宽度 (cm)');
legend(g,{'setosa','versicolor','virginica'},'Location','Northwest');
SVMModels = cell(3,1);
%SVMModels是一个3×1的元胞数组, 每个单元包含一个ClassificationSVM分类器. 
%对于每个细胞, 正类分别是setosa,versicolor和virginica
Cls = unique(Y); 
%Cls=unique(Y)表示去掉Y中的重复数据,并按从小到大排序返回给Cls.
rng(1); %可重复性
for j = 1:numel(Cls)
    indx = strcmp(Y,Cls(j)); %为每个分类器创建二分类
    SVMModels{j} = fitcsvm(X,indx,'ClassNames',[false true],'Standardize',true,...
        'KernelFunction','rbf','BoxConstraint',1);
end
d = 0.02;
[x1Grid, x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)), min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:), x2Grid(:)];
N = size(xGrid,1);
Scores = zeros(N,numel(Cls)); %存储得分
for j = 1:numel(Cls)
    [~,score] = predict(SVMModels{j},xGrid);
    Scores(:,j) = score(:,2); %第二列包含正类分数
end

在这里插入图片描述

%定义一个精细的网格, 并将坐标视为来自训练数据分布的新观察值, 使用每个分类器估计新观察值
%的得分. 每一行的分数包含三个分数, 得分最大的元素的索引是新类观察最可能所属的类的索引.
[~,maxScore] = max(Scores,[ ],2);
%根据相应的新观察结果所属的类,在图中的区域上色。
figure (2)
h(1:3) = gscatter(xGrid(:,1),xGrid(:,2),maxScore, [0.1 0.5 0.5; 0.5 0.1 0.5; 0.5 0.5 0.1]);
hold on
h(4:6) = gscatter(X(:,1),X(:,2),Y,'kkk','*po');
title('{鸢尾属植物分类区域}');
xlabel('花瓣长度(cm)'); ylabel('花瓣宽度(cm)');
legend(h,{'setosa region','versicolor region','virginica region',...
    'observed setosa','observed versicolor','observed virginica'},...
    'Location','Northwest');
axis tight
hold off

在这里插入图片描述

图表3- 3花瓣分类区域
我们定义了一个精细的网格,并将其坐标视为来自训练数据分布的新观察值。使用每个分类器估计新观察值的得分,并根据得分最大的元素的索引对新类观察最可能所属的类进行上色。我们成功地进行了二分类和多分类分析。二分类SVM模型清晰地展示了支持向量,而多分类SVM模型则展示了各类别的分类区域。
2.鸢尾花分类线性判别分析和二次判别分析
鸢尾花数据包括 150 个鸢尾花标本的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量值。三个品种各有 50 个标本。加载数据,查看萼片测量值在不同品种间有何差异。可以使用包含萼片测量值的两列。

load fisheriris
%)画出萼片长度和萼片宽度的散点图
f = figure;
gscatter(meas(:,1), meas(:,2), species,'rgb','osd');
xlabel('Sepal length萼片长度');
ylabel('Sepal width萼片宽度');
%假设您测量了一朵鸢尾花的萼片和花瓣,并且需要根据这些测量值确定它所属的品种。解决此问题的一种方法称为判别分析
N = size(meas,1);
 

在这里插入图片描述

图表3- 4误差值
假设您测量了一朵鸢尾花的萼片和花瓣,并且需要根据这些测量值确定它所属的品种。解决此问题的一种方法称为判别分析。
线性判别分析和二次判别分析
fitcdiscr 函数可以使用不同类型的判别分析进行分类。首先使用默认的线性判别分析 (LDA) 对数据进行分类。带有已知类标签的观测值通常称为训练数据。现在计算再代入误差,即针对训练集的误分类误差(误分类的观测值所占的比例)。
计算基于训练集的混淆矩阵。混淆矩阵包含有关已知类标签和预测类标签的信息。通常来说,混淆矩阵中的元素 (i,j) 是已知类标签为 i、预测类标签为 j 的样本的数量。对角元素表示正确分类的观测值。

%使用fitcdiscr 函数可以使用不同类型的判别分析进行分类。
lda = fitcdiscr(meas(:,1:2),species);
ldaClass = resubPredict(lda);
%带有已知类标签的观测值通常称为训练数据。现在计算再代入误差,即针对训练集的误分类误差(误分类的观测值所占的比例)。
ldaResubErr = resubLoss(lda)
%计算基于训练集的混淆矩阵
figure
ldaResubCM = confusionchart(species,ldaClass);

在这里插入图片描述

图表3- 5混肴矩阵图
在 150 个训练观测值中,有 20% 的(即 30 个)观测值被线性判别函数错误分类。您可以将错误分类的点画上 X 来查看是哪些观测值。

%在 150 个训练观测值中,有 20% 的(即 30 个)观测值被线性判别函数错误分类。您可以将错误分类的点画上 X 来查看是哪些观测值
figure(f)
bad = ~strcmp(ldaClass,species);
hold on;
plot(meas(bad,1), meas(bad,2), 'kx');
hold off;
%该函数将平面分成几个由直线分隔的区域,并为不同的品种分配了不同的区域。要可视化这些区域,一种方法是创建 (x,y) 值网格,并将分类函数应用于该网格。
[x,y] = meshgrid(4:.1:8,2:.1:4.5);
x = x(:);
y = y(:);
j = classify([x y],meas(:,1:2),species);
gscatter(x,y,j,'grb','sod')

在这里插入图片描述

计算出再代入误差。通常人们更关注测试误差(也称为泛化误差),即针对独立集合预计会得出的预测误差。事实上,再代入误差可能会低估测试误差。有另一个带标签的数据集,但您可以通过交叉验证来模拟一个这样的数据集。分层 10 折交叉验证是估计分类算法的测试误差的常用选择。它将训练集随机分为 10 个不相交的子集。每个子集的大小大致相同,类比例也与训练集中的类比例大致相同。取出一个子集,使用其他九个子集训练分类模型,然后使用训练过的模型对刚才取出的子集进行分类。您可以轮流取出十个子集中的每个子集并重复此操作。

qda = fitcdiscr(meas(:,1:2),species,'DiscrimType','quadratic');
qdaResubErr = resubLoss(qda)
rng(0,'twister');
%首先使用 cvpartition 生成 10 个不相交的分层子集。
cp = cvpartition(species,'KFold',10)
%LDA 交叉验证误差的值与此数据的 LDA 再代入误差相同。

%使用 10 折分层交叉验证估计 QDA 的真实测试误差。
cvqda = crossval(qda,'CVPartition',cp);
qdaCVErr = kfoldLoss(cvqda)

在这里插入图片描述

图表3- 6 knm算法
3.决策树分类
另一种分类算法基于决策树。决策树是一组简单的规则,例如,“如果萼片长度小于 5.45,则将样本分类为山鸢尾”。决策树也是非参数化的,因为它们不需要对每个类中的变量分布进行任何假设。

使用 fitctree 函数可创建决策树。为鸢尾花数据创建决策树,查看它对鸢尾花品种的分类效果。

%决策树分类
t = fitctree(meas(:,1:2), species,'PredictorNames',{'SL' 'SW' });
%可视化
[grpname,node] = predict(t,[x y]);
gscatter(x,y,grpname,'grb','sod')
%二叉树
view(t,'Mode','graph');
%计算决策树的再代入误差和交叉验证误差。
dtResubErr = resubLoss(t)

在这里插入图片描述

图表3- 7区域图
可视化决策树的另一种方法是绘制决策规则和类分配图。
在这里插入图片描述

图表3- 8决策树

这个看起来有些杂乱的树使用一系列形如 “SL < 5.45” 的规则将每个样本划分到 19 个终端节点之一。要确定观测值的品种分配,请从顶部节点开始应用规则。如果该点满足该规则,则沿左侧路线前进,如果不满足,则沿右侧路线前进。最后您将到达一个终端节点,将观测值分配给三个品种之一。

计算决策树的再代入误差和交叉验证误差。

%尝试对树进行剪枝。首先计算原始树的各种子集的再代入误差。
resubcost = resubLoss(t,'Subtrees','all');
[cost,secost,ntermnodes,bestlevel] = cvloss(t,'Subtrees','all');
plot(ntermnodes,cost,'b-', ntermnodes,resubcost,'r--')
figure(gcf);
xlabel('Number of terminal nodes');
ylabel('Cost (misclassification error)')
legend('Cross-validation','Resubstitution')

在这里插入图片描述

图表3- 9折线误差图

对于决策树算法,交叉验证误差估计值明显大于再代入误差。这表明生成的树对训练集过拟合。也就是说,此树可以很好地对原始训练集进行分类,但树的结构仅对这个特定的训练集敏感,因此对新数据的分类效果可能会变差。通常我们可以找到一个更为简单的树,它在处理新数据时要比复杂的树效果好。

尝试对树进行剪枝。首先计算原始树的各种子集的再代入误差。然后计算这些子树的交叉验证误差。图中显示再代入误差过于乐观。它随着树大小的增加而不断降低,但在某一点之后,随着树大小的增加,交叉验证误差率也随之增加。

[mincost,minloc] = min(cost);
cutoff = mincost + secost(minloc);
hold on
plot([0 20], [cutoff cutoff], 'k:')
plot(ntermnodes(bestlevel+1), cost(bestlevel+1), 'mo')
legend('Cross-validation','Resubstitution','Min + 1 std. err.','Best choice')
hold off

在这里插入图片描述

图表3- 10

通过计算截止值(等于最小成本加上一个标准误差),您可以在图上显示这一点。由 cvloss 方法计算的“最佳”级别是此截止值下的最小树。(注意,bestlevel=0 对应于未修剪的树,因此您必须加上 1 才能将其用作 cvloss 的向量输出的索引。)最后,可以查看修剪后的树并计算估计的误分类误差。

%修建后的二叉树为
pt = prune(t,'Level',bestlevel);
view(pt,'Mode','graph')
%误分类误差分析
cost(bestlevel+1)

在这里插入图片描述

图表3- 11最终剪枝后的二叉树

四、实验报告总结

基于MATLAB实现了K-Means算法和SVM算法,并将其应用于鸢尾花数据集上。通过实验验证,K-Means算法能够有效地对鸢尾花数据集进行聚类,并得到较好的聚类结果。然而,K-Means算法仍存在一些局限性,未来可以进一步探索如何改进算法以提高聚类的准确性和稳定性。同时,也可以尝试将K-Means算法与其他聚类算法进行结合,以充分利用各种算法的优势,提高聚类的性能。
通过对鸢尾花数据集的数据探索和分析,我们发现决策树、SVM和KNN等多种分类模型都能在该数据集上取得良好的分类效果。决策树模型提供了清晰的分类规则,有助于理解数据特征与分类结果之间的关系。而SVM和KNN模型则展示了通过调整参数和距离度量方式来优化模型性能的可能性。综合比较各模型的性能,我们可以得出结论,选择合适的模型和参数设置对于提升分类准确率至关重要。
我们可以看出分类的数据集的准确率和花瓣长度宽度,萼片宽度长度都有关。
通过此次对鸢尾花数据分类实验,使我深入了解和使用maltab对数据探索,对数据的处理,包括对数据的特征分析,数据预处理,数据的分布分析,缺失值分析,特征分析,对比分析,缺失值分析,离散化分析等数据可视化显示。使自己对于数据的敏感度,和对maltab的使用更进一步。

此次就到这里,有需要喜欢的可以点赞收藏。♥

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值