使用Python匹配未知数据平滑方法的结果

问题描述 投票:0回答:1

我正在尝试复制闭源软件应用程序 MATLAB 的平滑功能,以匹配其数据平滑结果。

我试着查看 MATLAB smoothing 文档,但根据我的经验,我不知道如何构建公式来获得这些结果。

原始数据示例

s1 = [1. 1. 1. 1. 1. 1. 1. 0.969. 1. 0.969. 0.938. 0.750. 0.563]
s2 = [0.500, 0.313, 0.500, 0.656, 0.719, 0.969, 1.000, 0.969, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.00]

平滑后的目标结果

注意:为了便于阅读,我将结果四舍五入到 2 位数。

st1 = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.996,, 0.988, 0.975, 0.941, 0.873, 0.768, 0.688]
st2 = [0.396, 0.416, 0.525, 0.666, 0.775, 0.883, 0.949, 0.973, 0.992, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00]

尝试

我尝试了

scipy.ndfilters
的不同过滤器,但我没有得到准确的目标结果。

注意:我使用字符串能够快速直观地比较数据。

from scipy.ndimage import uniform_filter1d as filter

s = [0.500, 0.313, 0.500, 0.656, 0.719, 0.969, 1.000, 0.969, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.00]

st = "0.396 | 0.416 | 0.525 | 0.666 | 0.775 | 0.883 | 0.949 | 0.973 | 0.992 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00"


def moving_avg(arr):
    for i in range(1, 6):
        z = ""
        csm = filter(arr, i, axis=-1)

        for num in csm:
            y = round(num*1000)/1000
            z += str(y) + " | "

        print(str(i) + ": " + z[:-3] + "\n")

moving_avg(s)
print("Y: " + str(st))


def test_smoothing(arr, num):
    sumup = 0
    for item in arr[num-2:num+3]:
        sumup += item
        print(item)
    res = sumup / 5
    print(res)

用于说明的平滑/不平滑问题的图像:

python arrays scipy smoothing
1个回答
0
投票

数据集是一个 16 x 16 字段的数组:

array = [[0] * 16] * 16
。这将由 0 到 1 之间的数据填充。

从我进行的测试(见下文)中,我认识到数据平滑窗口在 x 和 y 方向上设置为 3,并弄清楚平滑是如何发生的。

最终公式为:

smoothed_value = (raw_target * 4 + raw(above + below + left + right)*2 +
                  raw(upleft + upright + lowleft + lowright)*1) / 16

© www.soinside.com 2019 - 2024. All rights reserved.