最近有人托我写类似于泰坦尼克号生存预测的程序,不过人家还没想好用什么方法,所以在此我又把以前用python写过的泰坦尼克号翻出来用matlab写一遍。
泰坦尼克号数据的下载与介绍就不多说了,我以前的博文都写过。
[num,txt,raw]=xlsread('titanic3.xls');%读取数据,num返回的是excel中的数据,txt输出的是文本内容,row输出的是未处理数据
%挑出需要的数据
need=[2,1,4,5,6,7,9,11];
raw=raw(2:end-1,need);%'survived','pclass','sex','age','sibsp','parch','fare','embarked'
因为数据里既有数字也有文字,所以取元胞raw来进行数据处理。
对于无缺失值、并且取值为数字的属性,可以通过cell2mat直接转为矩阵。
date_mat(:,2)=cell2mat(raw(:,2));%无缺失值直接转
而对于无缺失、取值为文字的属性,则需要将文字转换为数字。
这里w_string是该属性所有的文字枚举元胞,data中与w_string里第1个文字段相同的将被转为1。
function [data_list]=wz2num(data,w_string)% 文字->数字
%输入为元胞,输出为数组
data_list=zeros(size(data))*nan;
%cc=tabulate(data);
for j=1:length(w_string)
bb=strcmp(data,w_string(j));
data_list(find(bb==1))=j;
end
end
对于有缺失的数据,需要想方设法填充,数据缺失的话应该是无法训练的。或许有高手不需要填充缺失数据,小弟不才,对这方面了解不多。所以我要把缺失数据填充完整,并且方法简单粗暴。
function [data_list]=fillmis(data,method,n,k,w_string)%缺失值填充
%data:数据元胞,method:方法,n:数字or文字,k:方法的范围/值,w_string:文字列表
if(n)%如果是数字
data_list=cell2mat(data);
data_list=fillmissing(data_list,method,k);
while(sum(isnan(data_list)))
data_list=fillmissing(data_list,method,k);
end
else
%data_list=zeros(size(data))*nan;
[data_list]=wz2num(data,w_string);
data_list=fillmissing(data_list,method,k);%'movmedian'
while(sum(isnan(data_list)))
data_list=fillmissing(data_list,method,k);
end
%tabulate(data_list)
end
end
fillmissing是matlab自带的填充函数,它有以下几个方法可以选择
这里加while是为了防止有些缺失地方没有被填充。
[date_x,PS] = mapminmax(date_mat',0,1);
需要注意的是mapminmax认为同一行是一个属性,对行进行归一化。
xx=1:size(date_x,2);yy=1:size(date_x,1);
image(xx,yy,date_x,'CDataMapping','scaled');colormap('jet');
colorbar
title('归一化颜色图');
function [x,y]=date_inscet()
[num,txt,raw]=xlsread('titanic3.xls');%读取数据,num返回的是excel中的数据,txt输出的是文本内容,row输出的是未处理数据
%挑出需要的数据
need=[2,1,4,5,6,7,9,11];
raw=raw(2:end-1,need);%'survived','pclass','sex','age','sibsp','parch','fare','embarked'
date_mat=zeros(size(raw));
%% 数据处理
date_mat=zeros(size(raw));
%w_string={'male' ,'female'};
date_mat(:,2)=cell2mat(raw(:,2));%无缺失值直接转
date_mat(:,3)=wz2num(raw(:,3),{'male' ,'female'});%性别(文字-》数字)
date_mat(:,4)=fillmis(raw(:,4),'movmean',1,10,0);%年龄缺失值填充
date_mat(:,5)=cell2mat(raw(:,5));
date_mat(:,6)=cell2mat(raw(:,6));
date_mat(:,7)=fillmis(raw(:,7),'movmean',1,20,0);%均值填充
date_mat(:,8)=fillmis(raw(:,8),'movmedian',0,100,{'C' ,'Q','S'});%中位数填
%归一化
[date_x,PS] = mapminmax(date_mat',0,1);
date_x=date_x';
%画归一化后的图
xx=1:size(date_x,2);yy=1:size(date_x,1);
image(xx,yy,date_x,'CDataMapping','scaled');colormap('jet');
colorbar
title('归一化颜色图');%xlabe1('特征');ylabel('个体');
x=date_x(:,2:end);
y=cell2mat(raw(:,1));
end
function [data_list]=wz2num(data,w_string)% 文字->数字
%输入为元胞,输出为数组
data_list=zeros(size(data))*nan;
%cc=tabulate(data);
for j=1:length(w_string)
bb=strcmp(data,w_string(j));
data_list(find(bb==1))=j;
end
end
function [data_list]=fillmis(data,method,n,k,w_string)%缺失值填充
%data:数据元胞,method:方法,n:数字or文字,k:方法的范围/值,w_string:文字列表
if(n)%如果是数字
data_list=cell2mat(data);
data_list=fillmissing(data_list,method,k);
while(sum(isnan(data_list)))
data_list=fillmissing(data_list,method,k);
end
else
[data_list]=wz2num(data,w_string);
data_list=fillmissing(data_list,method,k);%'movmedian'
while(sum(isnan(data_list)))
data_list=fillmissing(data_list,method,k);
end
end
end