我知道我可以像这样实现一个均方根误差函数:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
如果这个RMSE函数已经在某个库中实现了,比如说scipy或者scikit-learn,我是希望能够找到它的。
我知道我可以像这样实现一个均方根误差函数:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
如果这个RMSE函数已经在某个库中实现了,比如说scipy或者scikit-learn,我是希望能够找到它的。
如果你正在处理复数,那么你可能想要添加绝对值np.abs
。
import numpy as np
rms = np.sqrt(np.mean(np.abs(x-y)**2))
np.linalg.norm
,它已经处理了复数。import numpy as np
rms = np.linalg.norm(x-y)/np.sqrt(len(x))
PLY
之间 RMSE 的示例代码。它同时使用了 ml_metrics
库和 np.linalg.norm
函数:import sys
import SimpleITK as sitk
from pyntcloud import PyntCloud as pc
import numpy as np
from ml_metrics import rmse
if len(sys.argv) < 3 or sys.argv[1] == "-h" or sys.argv[1] == "--help":
print("Usage: compute-rmse.py <input1.ply> <input2.ply>")
sys.exit(1)
def verify_rmse(a, b):
n = len(a)
return np.linalg.norm(np.array(b) - np.array(a)) / np.sqrt(n)
def compare(a, b):
m = pc.from_file(a).points
n = pc.from_file(b).points
m = [ tuple(m.x), tuple(m.y), tuple(m.z) ]; m = m[0]
n = [ tuple(n.x), tuple(n.y), tuple(n.z) ]; n = n[0]
v1, v2 = verify_rmse(m, n), rmse(m,n)
print(v1, v2)
compare(sys.argv[1], sys.argv[2])
对于特定的使用情况,如果您不需要开销处理程序并且总是期望numpy数组输入,则最快的方法是在numpy
中手动编写函数。更重要的是,如果您经常调用它,可以使用numba
来加速。
import numpy as np
from numba import jit
from sklearn.metrics import mean_squared_error
%%timeit
mean_squared_error(y[i],y[j], squared=False)
445 µs ± 90.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
def euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.sqrt(((y1-y2)**2).mean())
%%timeit
euclidian_distance(y[i],y[j])
28.8 µs ± 2.54 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@jit(nopython=True)
def jit_euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.sqrt(((y1-y2)**2).mean())
%%timeit
jit_euclidian_distance(y[i],y[j])
2.1 µs ± 234 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
@jit(nopython=True)
def jit2_euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.linalg.norm(y1-y2)/np.sqrt(y1.shape[0])
%%timeit
jit2_euclidian_distance(y[i],y[j])
2.67 µs ± 60.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
额外说明:在我的使用情况中,numba
在 np.sqrt(((y1-y2)**2).mean())
上给出了略微不同但可以忽略的结果,而没有 numba
,结果将等于 scipy
的结果。你可以自己试试。
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error(y_true, y_pred)
因此,最终代码将类似于:
from sklearn.metrics import mean_squared_error
from math import sqrt
RMSD = sqrt(mean_squared_error(testing_y, prediction))
print(RMSD)
.mean()
,但写成了.sum()
。此外,我认为这个函数被使用得如此频繁,没有理由不将其作为库函数供人使用。 - siamiipredictions
和targets
的类型例如为int16
,则平方可能会溢出(产生负数)。因此,在使用平方之前,您可能需要使用.astype('int')
或.astype('double')
,例如np.sqrt(((predictions - targets).astype('double') ** 2).mean())
。 - John