IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 决策树及matlab实现 -> 正文阅读

[数据结构与算法]决策树及matlab实现

决策树及matlab实现

  1. 决策树逻辑实现(参考机器学习实战,将python代码改成matlab)
    代码结构
    在这里插入图片描述
    1.1. CalcEntropy
function shannonEnt=CalcEntropy(typeslist)
% 根据types列表,计算数据集的熵
% typeslist: 数据集的属性列表
% shannonEnt: 熵值计算
shannonEnt = 0;
Length = length(typeslist);
itemList = unique(typeslist); % 去重
pNum = length(itemList);
for i = 1:pNum
    itemLength = length(find(typeslist==itemList(i)));
    pItem = itemLength/Length;
    shannonEnt = shannonEnt-pItem*log2(pItem);
end

1.2. splitDataset

function retData=SplitDataset(data,axis,value)
% 按照给定的特征划分数据集
% data: 待划分数据集
% axis: 列数
% value: 特征的返回值
% retData: 划分后数据集
retData = [];
[m,n] = size(data);
for i = 1:m
    if data(i,axis) == value
        retData = [retData;data(i,:)];
    end
end
retData(:,axis) = [];

1.3. chooseBestFeatureToSplit

function bestFeature=chooseBestFeatureToSplit(dataset)
% 找到最好的划分指标
% dataset: 数据集
% bestFeature: 最优指标 num数值
[m,n] = size(dataset);
numFeatures = n-1;
originEntropy = CalcEntropy(dataset(:,n));   % 初始熵
bestInfoGain = 0.0;  % 熵变化最大值
bestFeature = -1;    % 最佳特征
for i = 1:numFeatures
    uniqueVals = unique(dataset(:,i));
    tmpEntropy = 0.0;
    for j = 1:length(uniqueVals)
        subDataset = SplitDataset(dataset,i,uniqueVals(j));
        prob = length(subDataset(:,1))/m;
        tmpEntropy = tmpEntropy+prob*CalcEntropy(subDataset);
    end
    infoGain = originEntropy-tmpEntropy;
    if infoGain > bestInfoGain
        bestInfoGain = infoGain;
        bestFeature = i;
    end
end

1.4. createTree

function tree=createTree(fatherNode, level, Edge, dataset, labels)
% 递归创建决策树
% fatherNode: 父节点
% level: 所属层次
% Edge: 边的属性
% dataset: 数据集
% labels: 特征属性
global tree;
branch = struct('level',level+1,'fatherNode',fatherNode,'Edge',Edge,'Node',[]);
[m,n] = size(dataset);
typesList = dataset(:,n);
% 第一种情况 数据集只剩一种type
if length(unique(typesList)) == 1
    branch.Node = typesList(1);
    tree = [tree branch];
    return;
end
% 第二种情况 遍历完所有特征
if length(dataset(1,:)) == 1
    branch.Node = mode(typeslist); % 取众数
    tree = [tree branch];
    return;
end
% 第三种情况
bestFeat = chooseBestFeatureToSplit(dataset);
bestFeatLabel = labels(bestFeat);
branch.Node = bestFeatLabel;
tree = [tree branch];
labels(strcmp(labels,bestFeatLabel)) = [];
featVals = unique(dataset(:,bestFeat));
for i = 1:length(featVals)
    createTree(branch.Node, branch.level, featVals(i), SplitDataset(dataset,bestFeat,featVals(i)), labels);
end

1.5. decisionTree

function decisionTreeModel=decisionTree(dataset,labels)
% 决策树模型训练主函数
% dataset: 数据集
% labels: 特征属性
% decisionTreeModel: 保存模型数据的struct数组
global tree;
tree=struct('level',-1,'fatherNode',[],'Edge',[],'Node',[]);
createTree('root',-1,-1,dataset,labels);
tree(1) = [];
tree(1) = [];
model.Node = tree;
decisionTreeModel = model;

1.6. modelPredict

function type=modelPredict(model,sample,labels,typesName)
% 训练好的模型进行预测
% model: 训练好的模型
% sample: 待预测样本
% typesName: 类别名称
% type: 输出类别
Nodes = model.Node;
rootNode = Nodes(1);
head = rootNode.fatherNode;
level = 1;
for i = 1:length(Nodes)
    if Nodes(i).level == level
        if Nodes(i).Edge == sample(find(labels==head))
            if length(find(typesName==double(Nodes(i).Node))) == 1
                type = Nodes(i).Node;
                break;
            else
                head = Nodes(i).Node;
                level = level+1;
            end
        end
    end
end
  1. Matlab自带函数实现

    2.1. dataPreprocess

function [xtrain,ytrain,xtest,ytest] = dataPreprocess()
% 数据预处理
% xtrain,ytrain,xtest,ytest:x训练集,测试集,y训练集,测试集
load fisheriris
x = meas;
y = species;
% 数据划分
train_index = randsample(150,120,false);
test_index = randsample(150,30,false);
xtrain = x(train_index,:);
xtest = x(test_index,:);
ytrain = y(train_index,:);
ytest = y(test_index,:);
% 数据归一化
% Flattened1 = xtrain';
% MappedFlattened1 = mapminmax(Flattened1); % 默认行归一
% xtrain = MappedFlattened1';
% Flattened2 = xtest';
% MappedFlattened2 = mapminmax(Flattened2); % 默认行归一
% xtest = MappedFlattened2';

2.2. modelTrain

function model = modelTrain(xtrain,ytrain)
% 模型训练
model =  fitctree(xtrain,ytrain);
view(model, 'Mode', 'graph');

2.3. modelTrainOpt

function model = modelTrainOpt(xtrain,ytrain)
% 模型训练 Optimize Classification Tree
model = fitctree(xtrain,ytrain,'OptimizeHyperparameters','auto');
view(model, 'Mode', 'graph');

2.4. modelPredict

function [train_acc,test_acc]=modelPredict(model,xtrain,ytrain,xtest,ytest)
% xtrain,ytrain,xtest,ytest
train_pre = predict(model,xtrain);
test_pre = predict(model,xtest);
train_right = 0;
for i = 1:length(train_pre)
    if isequal(train_pre(i),ytrain(i))
        train_right = train_right + 1;
    end
end
test_right = 0;
for i = 1:length(test_pre)
    if isequal(test_pre(i),ytest(i))
        test_right = test_right + 1;
    end
end
train_acc = train_right/length(ytrain);
test_acc = test_right/length(ytest);

本博客为个人笔记,欢迎交流!!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:21:18  更:2022-04-29 12:23:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:42:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码