Matlab对泰坦尼克号数据预处理

本文介绍使用Matlab进行泰坦尼克号数据预处理的方法,包括读取数据、处理无缺失和缺失属性、数据归一化及可视化。通过自定义函数实现文字到数字的转换和缺失值填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

最近有人托我写类似于泰坦尼克号生存预测的程序,不过人家还没想好用什么方法,所以在此我又把以前用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

ESP8266是一款常用的WiFi模块,它支持通过MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)连接到物联网服务器,实现设备之间的通信。以下是基本步骤: 1. **安装库**: - 首先,你需要在Arduino IDE中安装`PubSubClient`库,这是一个用于ESP8266与MQTT服务器通信的常用库。 2. **配置WiFi连接**: - 设置ESP8266连接到你的Wi-Fi网络,包括SSID和密码。 3. **设置MQTT客户端**: ```cpp #include <ESP8266WiFi.h> #include < PubSubClient.h > WiFiClient client; PubSubClient mqttClient(client, "your_broker_address", "username", "password"); ``` 这里"your_broker_address"替换为你的MQTT服务器地址,"username"和"password"则是登录账号和密码。 4. **连接到MQTT服务器**: ```cpp void connectToMqtt() { mqttClient.setServer("your_broker_address", 1883); while (!client.connected()) { if (client.connect("ESP8266Client")) { Serial.println("Connected to MQTT broker"); mqttClient.subscribe("$SYS/#"); // 订阅所有主题 } else { delay(5000); // 尝试重连,延时5秒 Serial.print("Attempting to reconnect..."); } } } ``` 5. **发布和订阅主题**: - 发布数据到主题: ```cpp void publish(String topic, String message) { mqttClient.publish(topic, message); Serial.println("Published message to " + topic); } ``` - 订阅并处理接收的数据: ```cpp void loop() { if (mqttClient.connected()) { mqttClient.loop(); // 处理接收到的消息 } // ...其他代码... } ``` 6. **断开连接**: ```cpp void stopMqtt() { mqttClient.disconnect(); Serial.println("Disconnected from MQTT broker"); } ``` 记得根据实际情况调整代码,并在`loop()`函数中添加相应的数据处理逻辑。当你有新的消息要发送或需要监听来自服务器的信息时,只需调用上述相应方法即可。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值