Matlab项目经验分享-去除震荡点

Matlab是做科研是比较常用的建模工具,研一做项目遇到了一个比较基础的问题,所以我打算记录下来并分享出来!

   处理问题步骤:      
        1. 抛出问题
        2. 思考解决方法
        3. 代码验证看结果
  1. 抛出问题

    在项目中有一批原始数据,在数据中有占很少比例的异样点,我们已经知道这些异样点是会影响结果精度的,需要剔除。
    为了去除这些震荡点,我们自定义一些数据来进行模拟,用以找出去除方法,模拟的优势就在于能更快解决问题。
    带有震荡点的模拟数据点图如下:

  2. 思考解决方法

    在这个模拟数据点图中可以看出所有的异样点都在曲线的上部,异样点在曲线的一侧(全在上部或者在下部)还算好办,
    若是有上有下则要复杂的多(以后的文章中应该还会讨论)。现在我们要想出一种好的算法来去除这些点,认真想想其实
    还真不是太容易搞···。经过思考之后,明确了问题的关键所在:

         (1). 如何找出这些点:
               方法:将每个点进行标号(0 1 2·· n),从第一个点开始,依次用后一个点的y值减去前一个点的y值并赋给自定义的变量diff1,
               例:diff1 = y(i+1) - y(i)
               若diff1 < 0 ,则继续,若diff1 > 0,则记录i+1这个点,并把i点作为新的起始点,用后面的点与i点做差,
               例:diff1 = y(i+m) - y(i), m > 1, 直到遇到使diff1 < 0 的点,那这个点就是正常点,i点到此点之间的就都是异样点。
         (2). 正常点之后还有异样点怎么解决?
               方法:很简单,用迭代方法就可以解决,迭代之后就都可以解决
         (3). 然后呢?
               找出异样点之后,将这些点删除,用新的数据数组代替原有数据数组,问题就解决了
    

    放个图可能更好理解:

  3. 代码验证看结果
    具体的代码如下:

         arry = [];%存放异常点下标
         i=1;
         while(i<length(A(:,1))-1)
             diff1 = A(i+1,2) - A(i,2);%后一点y值到前一点y值之差
            if diff1 > 0
                 n = i;%记住异常值前一点的下标
                 m=1;
                 arry=[arry;n+m];%记住异常值下标
                 diff1 = A(i+m+1,2) - A(i,2);
                 while diff1 > 0
                    arry = [arry;n+m+1];
                     m = m+1;
                     diff1 = A(n+1+m,2) - A(n,2);
                 end
                 i=i+m;
             end
             i=i+1;
         end
    
         %遍历数组 ARRY 删掉A中第arry(i)的元素
    
         bb = A(:,2);
         bb(arry) = [];
         xi2 = [1:length(A(:,1))];
         xi1 = xi2;
         xi1(arry) = [];
         result = interp1(xi1,bb,xi2)';
         A_new = [A(:,1),result];
         plot(A_new(:,1),A_new(:,2))。
    

    代码比较简单,注释就不方那么多了,思路理解了,写代码就很清晰了
    数据我就不展示了,看一下结果吧:

         我们解决问题的时候,首先要解决自己思想上的问题,思路清晰之后才好动手操作,这就是为什么算法工程师要比程序员的工资高,努力做个优秀的打工人!