Python中函数的均方根

23

我想在Python中计算函数的均方根。我的函数形式简单,例如y = f(x)。 x和y是数组。

我尝试过Numpy和Scipy文档,但没有找到相关内容。


你要计算的确切函数是什么?y的均方根值? - Praveen
如果您能添加一个示例数组和期望的解决方案,那将会很有帮助... - Praveen
不确定为什么要回答一个6年3个月前提出的问题 :D - Goran B.
5个回答

57

我假定您想要计算以下伪代码给出的表达式:

ms = 0
for i = 1 ... N
    ms = ms + y[i]^2
ms = ms / N
rms = sqrt(ms)

即,求y元素的平方值的平均数的平方根。

在numpy中,你可以简单地对y进行平方运算,取它的平均值,然后再取平方根,如下所示:

rms = np.sqrt(np.mean(y**2))

所以,举个例子:

>>> y = np.array([0, 0, 1, 1, 0, 1, 0, 1, 1, 1])  # Six 1's
>>> y.size
10
>>> np.mean(y**2)
0.59999999999999998
>>> np.sqrt(np.mean(y**2))
0.7745966692414834

如果您的问题意思不明确,请澄清一下。


非常感谢。我还有一个疑问。维基百科中的定义部分说,RMS实际上是一个限制。我的意思是它一直持续下去。但在你的回答中,只考虑了第一阶段。我认为我们在计算过程中不知道如何忽略其余部分? 你的答案有效。但我提出这个问题是为了澄清整个主题。 - user4179448
1
如果您想计算正弦波(即f(x)是一个正弦函数)或类似函数的RMS值,则需要进行积分。在这里,积分被近似为一个求和式。极限的使用是因为您需要对求和中的间隔取无穷小。换句话说,如果您在“x”中使用更细的分辨率,则可以更好地估算RMS值。 - Praveen
警告:在numpy中,如果数字比它们的类型(Python中的dtype)太大,则幂函数可能返回负值。为了避免这种情况,有时将值转换为其他类型是有用的。例如:>> np.sqrt(np.mean(y.astype(np.dtype(np.int64)) ** 2)). 在代码中不太好看,但它能完成工作! - PatriceG
2
@sandoval31 你可能想要将其强制转换为浮点数,而不是更大的整数。由于RMS通常不是整数,因此最好执行 y.astype(float) - Praveen

4

您可以使用sklearn函数。

from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_actual,[0 for _ in y_actual], squared=False)

2

只需使用math.dist(x, y)。 RMS基本上是N维欧几里得距离。


正确的链接:https://docs.python.org/zh-cn/3/library/math.html#math.dist - Goran B.

0

numpy.std(x)在均值(x)趋近于0的情况下(感谢@Seb),往往趋向于rms(x),例如声音记录、振动和其他从零波动的信号。

rms = lambda x_seq: (sum(x*x for x in x_seq)/len(x_seq))**(1/2)


1
一般来说,这是错误的。只有在 x.mean() == 0 这个非常特殊的情况下才是正确的。 - Seb
1
对于每个x,rms(x) = numpy.std(x-numpy.mean(x))。 - Avizipi
1
对于每个x,rms(x)的意思是:rms(x) = numpy.std(x-numpy.mean(x))。 - undefined

0

如果您想在计算 RMS 之前对数组进行框架,这是一个 numpy 解决方案:

nframes = 1000
rms = np.array([
    np.sqrt(np.mean(arr**2)) 
    for arr in np.array_split(arr,nframes)
])

如果您想指定帧长度而不是帧计数,您需要首先执行以下操作:
frame_length = 200
arr_length = arr.shape[0]
nframes = arr_length // frame_length +1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接