我有两个变量x和y的数据集(见下文)。我想找到x的哪个值,y中出现最大值。我目前的方法只是查找给出最大y的x。这不太理想,因为我的数据非常嘈杂,所以我想首先执行某种平滑,然后找到最大值。
到目前为止,我已尝试使用R从npreg
包中使用np
(内核回归)来平滑我的数据,以获得此曲线:
但我不确定如何找到最大值
我想在Python中解决以下问题:
1)平滑数据(不是内核回归)
2)使用平滑数据
找到x的值,其中y出现最大值x y
-20 0.006561733
-19 -4.48E-08
-18 -4.48E-08
-17 -4.48E-08
-16 0.003281305
-15 0.00164063
-14 0.003280565
-13 0.003282537
-12 -4.48E-08
-11 0.003281286
-10 0.004921239
-9 0.00491897
-8 -1.52E-06
-7 0.004925867
-6 -1.27E-06
-5 0.009839438
-4 0.001643726
-3 -4.48E-08
-2 2.09E-06
-1 -0.001640027
0 0.006559627
1 0.001636958
2 2.36E-06
3 0.003281469
4 0.011481469
5 0.004922279
6 0.018044207
7 0.011483134
8 0.014765087
9 0.008201379
10 0.00492497
11 0.006560482
12 0.009844796
13 0.011483199
14 0.008202129
15 0.001641621
16 0.004921645
17 0.006563377
18 0.006561068
19 0.008201004
答案 0 :(得分:2)
我对数据运行高斯滤波器以平滑:
# first, make a function to linearly interpolate the data
f = scipy.interpolate.interp1d(x,y)
# resample with 1000 samples
xx = np.linspace(-20,19, 1000)
# compute the function on this finer interval
yy = f(xx)
# make a gaussian window
window = scipy.signal.gaussian(200, 60)
# convolve the arrays
smoothed = scipy.signal.convolve(yy, window/window.sum(), mode='same')
# get the maximum
xx[np.argmax(smoothed)]
这是平滑的结果:
最大值出现在6.93。
scipy.signal
中有许多其他窗口函数和过滤选项。有关详情,请参阅documentation。
答案 1 :(得分:1)
您可以使用平滑样条函数:
import numpy as np
from scipy import interpolate
x = range(-20,20)
y = [0.006561733, -4.48e-08, -4.48e-08, -4.48e-08, 0.003281305, 0.00164063, 0.003280565, 0.003282537, -4.48e-08, 0.003281286, 0.004921239, 0.00491897, -1.52e-06, 0.004925867, -1.27e-06, 0.009839438, 0.001643726, -4.48e-08, 2.09e-06, -0.001640027, 0.006559627, 0.001636958, 2.36e-06, 0.003281469, 0.011481469, 0.004922279, 0.018044207, 0.011483134, 0.014765087, 0.008201379, 0.00492497, 0.006560482, 0.009844796, 0.011483199, 0.008202129, 0.001641621, 0.004921645, 0.006563377, 0.006561068, 0.008201004]
tck = interpolate.splrep(x,y) # pass in s= some value to change smoothing:
# higher = smoother, s=0 for no smoothing
xnew = np.arange(-20, 20, 0.1)
ynew = interpolate.splev(xnew,tck,der=0)
现在xnew
和ynew
包含精确采样的版本,您可以获得最大值
max_index = np.argmax(ynew)
max_value = ynew[max_index]
max_x = xnew[max_index]
抱歉,我无法测试这个;我现在正在使用的计算机没有scipy等加载...应该给你一些想法。
参考:http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html
答案 2 :(得分:1)
我不完全确定要解决的主要问题是什么?更好的平滑,找到最小值或在Python中完成所有操作?如果你在R上取得了很好的进展,你为什么要改用Python?我发现在R中,内置的supsmu
函数通常可以进行非常好的非参数平滑。这就是我在R中的表现。
smooth <- do.call(supsmu, data)
min.idx <- which.min(smooth$y)
min.point <- c(smooth$x[min.idx], smooth$y[min.idx])