我正在尝试编写一个函数,该函数 returns 数据集规模的间隙估计值。有人可以看一下吗?
I am trying to write a function that returns the value for a gapper estimate of scale of a dataset. Can someone take a look?
如果您不关心上下文而只想查看代码,请跳过两段。
我正在做一个项目,我正在测量星系团的速度分散,给定从我们小组 telescope 在南极 (SPT) 收集的星系红移数据。对于成员星系很少的星团,标准偏差或什至更复杂的双权重色散等典型估计量是不够的。
Wainer & Thissen (1976) 提出了一个有趣的规模估计量,它考虑了数据之间的差距来衡量分散性,他们证明这对小规模数据集非常有效(n = 10 时为 93%) )
定义如下:
其中 n 是样本大小,
,数据点之间的差距
,一组近似高斯的权重,并且
它非常简单,但我试图在 Python 中实现它并不断得到错误的答案。答案太小了。不过我看不出有什么问题,我几乎检查了所有东西。有没有人看到我遗漏的细微语法错误或其他什么?这是函数:
def gDispersion(v):
# Returns the gapper velocity dispersion of a cluster (Sigma_G), given galaxy proper velocity data,
# v is an array of velocity values.
try:
#allocate array for Gaussian weights
w = [0] * (len(v)-1)
g = [0] * (len(v)-1)
n = len(v)
except TypeError:
# ensure input is valid
print('Array or array-like object expected; got {}'.format(type(v)))
return
# find gaussian weights
for i in range(len(v) - 1):
g[i] = v[i+1] - v[i]
w[i] = i * (n - i)
sigG = (np.sqrt(np.pi))/(n*(n-1)) * sum([wi*gi for wi,gi in zip(w,g)])
return sigG
你的体重是错误的。在循环中 i
取值 0, 1, ..., n-2
,所以
w[0] = 0, w[1] = 1*(n-1), ..., w[n-2] = (n-2)*2
循环也是不必要的。这是一个向量化的实现:
def gDispersion(v):
""" Returns the gapper velocity dispersion of a cluster (Sigma_G)
v is an array of galaxy velocity values.
"""
n = len(v)
w = np.arange(1, n) * np.arange(n-1, 0, -1)
g = np.diff(v)
sigG = (np.sqrt(np.pi))/(n*(n-1)) * np.dot(w, g)
return sigG
顺便说一下,使用 docstrings 而不是注释来记录您的函数。
如果您不关心上下文而只想查看代码,请跳过两段。
我正在做一个项目,我正在测量星系团的速度分散,给定从我们小组 telescope 在南极 (SPT) 收集的星系红移数据。对于成员星系很少的星团,标准偏差或什至更复杂的双权重色散等典型估计量是不够的。
Wainer & Thissen (1976) 提出了一个有趣的规模估计量,它考虑了数据之间的差距来衡量分散性,他们证明这对小规模数据集非常有效(n = 10 时为 93%) )
定义如下:
其中 n 是样本大小,
它非常简单,但我试图在 Python 中实现它并不断得到错误的答案。答案太小了。不过我看不出有什么问题,我几乎检查了所有东西。有没有人看到我遗漏的细微语法错误或其他什么?这是函数:
def gDispersion(v):
# Returns the gapper velocity dispersion of a cluster (Sigma_G), given galaxy proper velocity data,
# v is an array of velocity values.
try:
#allocate array for Gaussian weights
w = [0] * (len(v)-1)
g = [0] * (len(v)-1)
n = len(v)
except TypeError:
# ensure input is valid
print('Array or array-like object expected; got {}'.format(type(v)))
return
# find gaussian weights
for i in range(len(v) - 1):
g[i] = v[i+1] - v[i]
w[i] = i * (n - i)
sigG = (np.sqrt(np.pi))/(n*(n-1)) * sum([wi*gi for wi,gi in zip(w,g)])
return sigG
你的体重是错误的。在循环中 i
取值 0, 1, ..., n-2
,所以
w[0] = 0, w[1] = 1*(n-1), ..., w[n-2] = (n-2)*2
循环也是不必要的。这是一个向量化的实现:
def gDispersion(v):
""" Returns the gapper velocity dispersion of a cluster (Sigma_G)
v is an array of galaxy velocity values.
"""
n = len(v)
w = np.arange(1, n) * np.arange(n-1, 0, -1)
g = np.diff(v)
sigG = (np.sqrt(np.pi))/(n*(n-1)) * np.dot(w, g)
return sigG
顺便说一下,使用 docstrings 而不是注释来记录您的函数。