Matlab项目经验分享-去除震荡点
- 2020 年 11 月 23 日
- 筆記
- matlab; 去除震荡点, Matlab项目经验分享
Matlab是做科研是比较常用的建模工具,研一做项目遇到了一个比较基础的问题,所以我打算记录下来并分享出来!
处理问题步骤:
1. 抛出问题
2. 思考解决方法
3. 代码验证看结果
-
抛出问题
在项目中有一批原始数据,在数据中有占很少比例的异样点,我们已经知道这些异样点是会影响结果精度的,需要剔除。
为了去除这些震荡点,我们自定义一些数据来进行模拟,用以找出去除方法,模拟的优势就在于能更快解决问题。
带有震荡点的模拟数据点图如下:
-
思考解决方法
在这个模拟数据点图中可以看出所有的异样点都在曲线的上部,异样点在曲线的一侧(全在上部或者在下部)还算好办,
若是有上有下则要复杂的多(以后的文章中应该还会讨论)。现在我们要想出一种好的算法来去除这些点,认真想想其实
还真不是太容易搞···。经过思考之后,明确了问题的关键所在:(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). 然后呢? 找出异样点之后,将这些点删除,用新的数据数组代替原有数据数组,问题就解决了
放个图可能更好理解:
-
代码验证看结果
具体的代码如下: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))。
代码比较简单,注释就不方那么多了,思路理解了,写代码就很清晰了
数据我就不展示了,看一下结果吧:
我们解决问题的时候,首先要解决自己思想上的问题,思路清晰之后才好动手操作,这就是为什么算法工程师要比程序员的工资高,努力做个优秀的打工人!