数学建模:数据的预处理

news2024/12/23 20:54:58

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

文章目录

  • 数据预处理
    • 数据变换
    • 数据清洗
      • 缺失值处理
      • 异常值处理

数据预处理

在这里插入图片描述

数据变换

常见的数据变换的方式:通过某些简单的函数进行数据变换。

x ′ = x 2 x ′ = x x ′ = log ⁡ ( x ) ∇ f ( x k ) = f ( x k + 1 ) − f ( x k ) \begin{aligned}&x^{\prime}=x^2 \\&\begin{aligned}x^{\prime}=\sqrt{x}\end{aligned} \\&x'=\log(x) \\\nabla f\left(x_{k})\right.&=f(x_{k+1})-f(x_k) \end{aligned} f(xk)x=x2x=x x=log(x)=f(xk+1)f(xk)

  • 数据指标的一致化处理:
    • 极小型
    • 极大型
    • 中间型
    • 区间型
  • 数据指标的无量纲化处理:
    • 零 - 均值规范化:也叫做标准差规范化,经过处理后的数据平均值为 0,标准差为1。 x ‾ \overline x x 为原数据的均值, σ \sigma σ 为标准差。

      x ∗ = x − x ‾ σ x^*=\frac{x-\overline{x}}\sigma x=σxx

    • 极值差法:又叫最小 - 最大规范化,离差标准化,将数据映射到 [ 0 , 1 ] [0,1] [0,1] 之间。

      x ∗ = x − m i n m a x − m i n x^*=\frac{x-min}{max-min} x=maxminxmin

    • 功效系数法:就是上一步极值差法然后加了一个偏移量 c c c ,使得最后结果落于 [ c , c + n ] [c,c+n] [c,c+n]

数据变换的应用方式:数据的标准化,目的是为了消除指标之间的量纲和大小不一的影响,需要进行数据标准化处理。

因此可以将数据按照比例进行缩放,使之落入一个据标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,从而进行综合分析。如将工资收入属性值映射到[-1,1]或者[0,1]之间。

function data1=mfunc_calculate(data,zhibiao_label)
    % 指标的正向化处理 1 2 极大型;3 4 5 极小型;6 单点最优;7 区间最优
    if isa(data,'double')
        for i=1:length(zhibiao_label)
            if (zhibiao_label(i)==1)
                data1(:,i)=zheng1(data(:,i));
            elseif (zhibiao_label(i)==2)
                data1(:,i)=zheng2(data(:,i));
        elseif (zhibiao_label(i)==3)
                data1(:,i)=fu3(data(:,i));
        elseif (zhibiao_label(i)==4)
                data1(:,i)=fu4(data(:,i));
       elseif (zhibiao_label(i)==5)
                data1(:,i)=fu5(data(:,i));
      elseif (zhibiao_label(i)==6)
          prompt = '这是单点最优,请输入单点最优值 ';
           a = input(prompt);
               data1(:,i)=qu6(data(:,i),a);
      elseif (zhibiao_label(i)==7)
         prompt = '这是区间最优,请输入单点最区间如[5,10] ';
          aa=input(prompt);
               data1(:,i)=qu7(data(:,i),aa(1),aa(2));
        end
        end
    elseif isa(data,'cell')
    %     data2=data;
        for j=1:length(data)
            data2=data{j};
            if size(zhibiao_label,1)==1
                zhibiao_label1=repmat(zhibiao_label,3,1);
            else
                zhibiao_label1=zhibiao_label;
           end
            for i=1:length(zhibiao_label1(j,:))
                   if (zhibiao_label(i)==1)
                data1{j}(:,i)=zheng1(data2(:,i));
            elseif (zhibiao_label(i)==2)
                data1{j}(:,i)=zheng2(data2(:,i));
           elseif (zhibiao_label(i)==3)
                data1{j}(:,i)=fu3(data2(:,i));
           elseif (zhibiao_label(i)==4)
                data1{j}(:,i)=fu4(data2(:,i));
          elseif (zhibiao_label(i)==5)
                data1{j}(:,i)=fu5(data2(:,i));
         elseif (zhibiao_label(i)==6)
          prompt = '这是单点最优,请输入单点最优值 ';
           a = input(prompt);
               data1{j}(:,i)=qu6(data2(:,i),a);
        elseif (zhibiao_label(i)==7)
         prompt = '这是区间最优,请输入单点最区间如[5,10] ';
          aa=input(prompt);
               data1{j}(:,i)=qu7(data2(:,i),aa(1),aa(2));
        end
            end
        end
    end
    end
    function data=zheng1(data1)
    %正向指标1
    % 填1的时候选择
    data=(data1-min(data1))./(max(data1)-min(data1));
    end
    function data=zheng2(data1)
    %正向指标2
    % 填2的时候选择
    data=data1;
    end
    function data=fu3(data1)
    %负向指标1
    % 填3的时候选择
    data=(max(data1)-data1)./(max(data1)-min(data1));
    end
    function data=fu4(data1)
    %负向指标2
    % 填4的时候选择
    data=(max(data1)-data1);
    end
    function data=fu5(data1)
    %负向指标3
    % 填5的时候选择
    data=1./(max(abs(data1))+data1);
    end
    function data=qu6(data1,a)
    %某点最优
    % 填6的时候选择
    data=1./(abs(data1-a)/max(abs(data1-a)));
    end
    function data=qu7(data1,a,b)
    %区间指标1
    % 填7的时候选择
    for i=1:length(data1)
        if(data1(i)>a)&&(data1(i)<b)
            data(i)=1;
        elseif (data1(i)<a)
            data(i)=data1(i)/a;
        elseif (data1(i)>b)
            data(i)=b/data1(i);
        end
    end
end

数据清洗

缺失值处理

对于缺失值的三种处理方法:不处理,删除数据,数据插补

数据插补的方法:

  • 均值/中位数/众数插补
  • 使用固定值插补
  • 最近邻插补:即在记录中找到与缺失样本最接近的样本的该属性插补,可以通过计算对象间的欧式距离衡量。
  • 回归方法插补:根据已有数据和与其有关的其他变量的数据建立拟合模型来预测缺失值
  • 插值法插补(推荐):常用的插值法有很多,主要有拉格朗日插值法、牛顿插值法

对于缺失值处理,我们需要分情况讨论。

如果某个变量或某个样本缺失了 70%以上的数据,那么此时对数据进行填补的话,会引入更多的噪声,反而会降低模型的性能,故此时一般直接将该变量或样本删除;

如果缺失的不多,我们可以考虑对缺失值进行填补


matlab API:

  • ismissing 或者 isnan :返回一个与输入矩阵同形状的01矩阵,1表示此位置是缺失值
  • rmmissing:直接删除缺失值所在的行列,第二个参数 1 表示行,2表示列。
  • fillmissing:填补缺失值。
    • 常数填充:constant

      • 插值法,常见的插值方法如下:

    • 移动窗口填充法:该方法的思想是在缺失值前后开一个“窗口”,用“窗口”内 的数据的均值中位数进行填充。

代码实现:

clc;clear;
% 数据的预处理
load("带缺少数据.mat");

data = data_nan;
%% 缺失值处理
% 判断矩阵中是否存在nan值,返回一个同形状的0-1矩阵,1表示此位置是nan
nan_mat = isnan(data);
%% 直接删除空值所在的行:1
data1 = rmmissing(data); %默认为1行
%% 直接删除空值所在的列:2
data2 = rmmissing(data,2);

%% 填充缺失值,插值 
%  1. 常量填充缺失值
data3 = fillmissing(data,"constant",999);
%% 2. 上一个或者下一个非空值 
data4 = fillmissing(data,'previous'); % next 表示以下一个非空值填充
%% 3. 最邻近的非空值
data5 = fillmissing(data,'nearest');
%% 4. 三次样条插值 
data6 = fillmissing(data,'spline'); % phcip 保持三次样条插值
%% 5. 窗口填补法 
data7 = fillmissing(data,'movmean',8,1); % movean 窗口长度为 window 的移动均值;  movmedian:移动中位数

异常值处理

  • 正态分布3σ原则:总体符合正态分布,例如人口数据、测量误差、生产加工质量、考试成绩等。
    • 计算均值 μ 和标准差 σ 。
    • 判断每个数据值是否在(μ-3σ,μ+3σ) 内,不在则为异常值.
    • 异常值可以转换为 nan 值,然后再进行上一步的缺失值处理
  • 画箱线图:下四分位数Q1是排第25%的数值,上四分位数Q3是排第75%的数值。四分位距IQR= Q3-Q1,也就是排名第75%的减去第25%的数值正态分布类似,设置个合理区间,在区间外的就是异常值。一般设[Q1−1.5IQR, Q3+1.5IQR]内为正常值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZLMediaKit 各种推拉流

1 用ffmpeg 推音视频流 ./ffmpeg -f dshow -i video"HP Wide Vision HD Camera" -f dshow -i audio"麦克风阵列 (Realtek High Definition Audio)" -rtbufsize 100M -max_delay 100 -pix_fmt yuv420p -tune zerolatency -c:v libx264 -crf 18 -s 1280x720…

java八股文面试[多线程]——synchronized锁升级过程

速记&#xff1a;偏向-轻量-重量 锁膨胀 上面讲到锁有四种状态&#xff0c;并且会因实际情况进行膨胀升级&#xff0c;其膨胀方向是&#xff1a;无锁——>偏向锁——>轻量级锁——>重量级锁&#xff0c;并且膨胀方向不可逆 一.锁升级理论. 在synchronized锁升级过程…

Kotlin学习之密封类

Kotlin中的密封类: kotlin中的密封类&#xff0c;用关键词Sealed修饰&#xff0c;且还有一个规定&#xff1a;Sealed类的子类应该是Sealed类的嵌套类&#xff0c;或者应该在与Sealed类相同的文件中声明。 当我们想定义一个有相同父类&#xff0c;但是有不同子类的时候&#xf…

面试中的系统设计:应对复杂问题的方法与技巧

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

巨人互动|游戏出海游戏出海的趋势如何

随着全球游戏市场的不断扩大和消费者需求的多元化&#xff0c;游戏出海作为游戏行业的重要战略之一&#xff0c;正面临着新的发展趋势。本文小编将讲讲游戏出海的趋势&#xff0c;探讨一下未来游戏出海的发展方向与前景。 巨人互动|游戏出海&2023国内游戏厂商加快“出海”发…

Linux命令查看CPU、内存、IO使用情况简单介绍

文章目录 1. CPU相关介绍1.1 物理CPU1.2 物理CPU内核1.3 逻辑CPU1.4 几核几线程1.5 CPU设计图 2. top 查看系统负载、CPU使用情况2.1 系统整体的统计信息2.2 进程信息2.3 top命令使用 3. lscpu 显示有关 CPU 架构的信息4. free 查看内存信息5. iostat 查看io信息 1. CPU相关介绍…

angular抛出 ExpressionChangedAfterItHasBeenCheckedError错误分析

当变更检测完成后又更改了表达式值时&#xff0c;Angular 就会抛出 ExpressionChangedAfterItHasBeenCheckedError 错误。Angular 只会在开发模式下抛出此错误。 在开发模式下&#xff0c;Angular 在每次变更检测运行后都会执行一次附加检查&#xff0c;以确保绑定没有更改。这…

一台服务器上部署 Redis 伪集群

哈喽大家好&#xff0c;我是咸鱼 今天这篇文章介绍如何在一台服务器&#xff08;以 CentOS 7.9 为例&#xff09;上通过 redis-trib.rb 工具搭建 Redis cluster &#xff08;三主三从&#xff09; redis-trib.rb 是一个基于 Ruby 编写的脚本&#xff0c;其功能涵盖了创建、管…

经纬恒润荣获吉利汽车“最佳价值贡献”奖

8月18日&#xff0c;以“全面向新 共创共赢”为主题&#xff0c;吉利汽车在宁波成功举行2023年电子电器核心供应商恳谈会。经纬恒润凭借在项目合作上持续创新、高效协同等优异表现&#xff0c;获得“最佳价值贡献”奖项。 作为国产汽车代表性品牌之一&#xff0c;吉利汽车积极推…

从Matrix-ResourceCanary看内存泄漏监控

作者&#xff1a;小海编码日记 不同于LeakCanary&#xff0c;在Matrix中&#xff0c;主要是通过Resource Canary来监控内存泄漏问题的&#xff0c;且监听的泄漏对象只支持Activity&#xff0c;官方说明如下&#xff1a; 结合分析LeakCanary的经验可知&#xff0c;要实现Activit…

BananaPi BPI-6202工业控制板全志科技A40i、24V DC输入、RS485接口

Banana Pi BPI-6202“嵌入式单板计算机”采用工业级全志A40i四核Cortex-A7处理器&#xff0c;工业温度范围和长生命周期&#xff0c;2GB DDR3&#xff0c;8GB eMMC闪存&#xff0c;M.2 SATA插槽等。 这是自 Banana Pi去年推出Banana Pi BPI-M2 Ultra SBC 和BPI-M2 Berry以来&am…

机械臂+2d相机实现复合机器人定位抓取

硬件参数 机械臂&#xff1a;艾利特 相机&#xff1a;海康相机 2d识别库&#xff1a;lindmod&#xff0c;github可以搜到 光源&#xff1a;磐鑫光源 软件参数 系统&#xff1a;windows / Linux 开发平台&#xff1a;Qt 开发语言&#xff1a;C 开发视觉库&#xff1a;OpenCV …

[C/C++]天天酷跑游戏超详细教程-上篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

maven推包The environment variable JAVA_HOME is not correctly set

解决办法&#xff1a; 打开idea查看jdk安装位置 1.在/etc下面创建&#xff08;如果存在就是更新&#xff09;launchd.conf。里面添加一行&#xff1a; setenv JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/Home #JAVA_HOME后面是我的java安装路径…

OK3588应用之——人脸和人脸关键点的检测(十四)

一、主机模型转换 采用FastDeploy来部署应用深度学习模型到OK3588板卡上 进入主机Ubuntu的虚拟环境 conda activate ok3588 主机环境搭建可以参考上一篇 《OK3588板卡实现人像抠图&#xff08;十二&#xff09;》 转换成RKNN模型 cd FastDeploy wget https://bj.bcebos.co…

CDL基础原理

一、CDL简介 CDL&#xff08;全称Change Data Loader&#xff09;是一个基于Kafka Connect框架的实时数据集成服务。 CDL服务能够从各种OLTP数据库中捕获数据库的Data Change事件&#xff0c;并推送到kafka&#xff0c;再由sink connector推送到大数据生态系统中。 CDL目前支…

计算机竞赛 基于机器视觉的停车位识别检测

简介 你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里&#xff0c;那是不是很爽&#xff1f;事实证明&#xff0c;基于深度学习和OpenCV解决这个问题相对容易&#xff0c;只需获取停车场的实时视频即可。 该项目较为新颖&#xf…

python matlab 画柱状图

函数&#xff1a; bar(x, height, width0.8, bottomNone, *, aligncenter,dataNone, **kwargs) 设置坐标的刻度(ticks)&#xff0c;轴的标签和标题 在数据分析的很多时候&#xff0c;我们各个柱下面通常不是x刻度值&#xff0c;而是有实际意义的字符串&#xff0c;那么这个时…

ClickHouse进阶(三):ClickHouse 索引

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

最简单vue获取当前地区天气--高德开放平台实现

目录 前言 一、注册成为高德平台开发者 二、注册天气key 1.点击首页右上角打开控制台 2.创建新应用 三、vue项目使用 1.打开vue项目找到public下的index.html&#xff0c;如果是vue3的话直接在主目录打开index.html文件就行&#xff0c;主要就是打开出口文件 ​编辑 2.根据高德…