function data=readtraindata(filename)
% 输入数据
%filename=文件名
%输出数据
%data是输出数据
%% ------------------------------------数据处理部分开始---------------------------------------------------
% 读取部分
dim=13;
DataTypes=[0,0,0,1,1,1,1,1,0,0,0,0];%1表示离散,0表示连续
fid = fopen(filename);
dcells = textscan(fid, '%s');
fclose(fid);
A=dcells{1};
s1=A{1};
str=strrep(s1,',',' ');
str2=textscan(str, '%s %s %s %s %s %s %s %s %s %s %s %s %s');
[k11,k12]=size(A);
for j=1:dim
data.itemname{1,j}=str2{j}{1};
end
data01=cell(k11-1,dim);
wait_hand = waitbar(0,'正在读取数据,请等待……', 'tag', 'TMWWaitbar');
for i=2:k11
waitbar(i/k11,wait_hand);%每循环一次更新一次进步条
s1=A{i};
str=strrep(s1,',',' ');
str2=textscan(str, '%s %s %s %s %s %s %s %s %s %s %s %s %s');
for j=1:dim
data01{i-1,j}=str2{j}{1};
end
end
delete(wait_hand);%执行完后删除该进度条
%% --------------以上ok----------------------------------------
datatemp3=data01(:,dim);%记录分类数据
data.targets=str2double(datatemp3);
%
% a1=findstr(ss,'7')%查找字符串
% unique
% index=strcmp(y, 'm');%查找y中等于m的位置,对cell也适用
%% 求离散类别的个数
[k21,k22]=size(DataTypes);
[k31,k32]=size(data01);
data02=data01;%初始化处理后的数据集
%%
%进度条
wait_hand = waitbar(0,'正在处理数据,请等待……', 'tag', 'TMWWaitbar');
for i=1:k22
waitbar(i/k22,wait_hand);%每循环一次更新一次进步条
if (DataTypes(i))%如果该列是离散的,求类个数
datatemp1=data01(:,i);
datatemp2=unique(datatemp1);%剔除相同元素,仅留一个
ind1=strcmp(datatemp2,'?');%找是否有'?'元素
if sum(ind1)==1%有'?'元素
[ind2,v1]=find(ind1==1);
datatemp2(ind2)=[];
else%无有'?'元素
%不操作
end
if isempty(datatemp2)
error('wrong data');
else
data.Types(i).Number=length(datatemp2);%记录个数
data.Types(i).Set=datatemp2;%记录类型集
end
%% ---------------------处理离散不完整数据开始---------------
datatemp3=data01(:,dim);%记录分类数据
ind1=strcmp(datatemp1,'?');%找原始的一列数据是有'?'元素的位置
[ind2,v2]=find(ind1==1);
if ~isempty(ind2)
a1=length(ind2);%数据长度
for j=1:a1
type1=data01{ind2(j),dim};%求是哪个分类
ind3=strcmp(datatemp3,type1);%同一分类的数据在那些位置
[ind4,v2]=find(ind3==1);%找出所在的行标,由于datatemp3是列向量,所以ind3是列向量,因此ind4要在第一个输出参数
if ~isempty(ind4)
temp1=data01(ind4,i);
temp2=unique(temp1);%剔除相同元素
ind10=strcmp(temp2,'?');%找是否有'?'元素
if sum(ind10)==1%有'?'元素
[ind12,v1]=find(ind10==1);
temp2(ind12)=[];
end
a3=length(temp2);
ElementCount=zeros(a3,1);
for t2=1:a3%统计元素概率
index5=strcmp(temp1,temp2(t2));
[index6,v2]=find(index5==1);
ElementCount(t2,1)=length(index6);%第t2个元素有几个,注意对应的是temp2这个集
end
P=ElementCount./sum(ElementCount);%求概率
num=1;%轮盘赌次数设定
Select01=Roulette(P,num);
data02{ind2(j),i}=temp2{Select01};%把问号改成选择的结果
end
end
end
%% ---------------------处理离散不完整数据结束---------------
else%如果该列是连续的,求最大最小值
data.Types(i).Number=-1;%计为-1
datatemp1=[];
for j=1:k31%历遍一列的所有数据
if strcmp(data01{j,i},'?')%如果data01{j,i}等于'?',那么不处理
else%如果data01{j,i}等于'?',那么不处理,保存为数值
datatemp1=[datatemp1;
str2double(data01{j,i})];
end
end
data.Types(i).Max=max(datatemp1);%
data.Types(i).Min=min(datatemp1);%
%% -----------处理连续数据开始---------------
datatemp3=data01(:,dim);%记录分类数据
datatemp1=data01(:,i);
ind1=strcmp(datatemp1,'?');%找原始的一列数据是有'?'元素的位置
[ind2,v2]=find(ind1==1);
if ~isempty(ind2)
a1=length(ind2);%数据长度
for j=1:a1
type1=data01{ind2(j),dim};%求是哪个分类
ind3=strcmp(datatemp3,type1);%同一分类的数据在那些位置
[ind4,v2]=find(ind3==1);%找出所在的行标,由于datatemp3是列向量,所以ind3是列向量,因此ind4要在第一个输出参数
if ~isempty(ind4)
temp1=data01(ind4,i);
temp2=unique(temp1);%剔除相同元素
ind10=strcmp(temp2,'?');%找是否有'?'元素
if sum(ind10)==1%有'?'元素
[ind12,v1]=find(ind10==1);
temp2(ind12)=[];%删除问号
end
temp3=str2double(temp2);
data02{ind2(j),i}=num2str(mean(temp3));%把问号改成选择的结果
end
end
end
%% -----------处理连续数据结束---------------
end
end
delete(wait_hand);%执行完后删除该进度条
% s08=data02{28,5}
% s06=data02{6,12}
% s20=data02{20,12}
% s81=data02{81,12}
%% ----------------进一步的数据处理,全部数字化开始------------------
wait_hand = waitbar(0,'正在数字化处理数据,请等待……', 'tag', 'TMWWaitbar');
data03=zeros(k11-1,dim-1);
for i=1:k22
waitbar(i/k22,wait_hand);%每循环一次更新一次进步条
if (DataTypes(i))%如果该列是离散的
datatemp2=data.Types(i).Set;%记录类型集
for j=1:k31
index1=strcmp(datatemp2,data02{j,i});%对应哪一个
[index2,v2]=find(index1==1);
data03(j,i)=index2;
end
else%连续的处理方法
for j=1:k31
data03(j,i)=str2double(data02{j,i});
end
end
end
delete(wait_hand);%执行完后删除该进度条
%% 记录数据
data.Data=data03;
data.dim=dim;
data.DataTypes=DataTypes;
% data.Types(1:12).Set;
% data03
%% ----------------进一步的数据处理,全部数字化结束------------------
%% ----------------------数据处理部分结束------------------------------------------------------
没有合适的资源?快使用搜索试试~ 我知道了~
C4.5完整MATLAB代码
共10个文件
m:7个
csv:3个
需积分: 5 3 下载量 113 浏览量
2024-01-29
13:51:08
上传
评论 1
收藏 15KB ZIP 举报
温馨提示
C4.5决策树算法是一种常见的机器学习方法,由Ross Quinlan在1993年提出。它是ID3算法的扩展和改进,主要用于分类任务,可以处理连续值和离散值属性的数据。 C4.5决策树算法的基本思路是通过特征选择的方式,将具有最佳分类能力的特征作为决策树的根节点。然后,根据这个特征的取值将数据集划分为多个子集,对每个子集递归地生成子树。在生成过程中,C4.5算法使用了信息增益比作为特征选择的准则,有效地解决了ID3算法偏向于选择取值多的特征的问题。
资源推荐
资源详情
资源评论
收起资源包目录
代码.zip (10个子文件)
make_tree.m 3KB
readtestdata.m 5KB
readvalidatedata.m 5KB
Roulette.m 635B
validate.csv 5KB
readtraindata.m 6KB
train.csv 6KB
mainc453.m 950B
C4_5.m 6KB
test.csv 185B
共 10 条
- 1
资源评论
MATLAB代码顾问
- 粉丝: 1w+
- 资源: 110
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功