<p>不太有用的答案是因为scipy就是这样定义它的,所以你最好让开发人员得到一个明确的答案。
真正地。文档中的示例是</p>
<pre><code>from scipy.stats import circvar
circvar([0, 2*np.pi/3, 5*np.pi/3])
2.19722457734
</code></pre>
<p>所以你不能说这种行为是未经批准的。
但为什么要这样做呢?在</p>
<p>你的第二个链接定义了一组n个角a_1。。。作为联合国</p>
<blockquote>
<p>V = 1 − \hat{R_1}</p>
</blockquote>
<p>在哪里</p>
<blockquote>
<p>\hat{R_1} = R_1 / n
R_1 = \sqrt{C^2 + S^2}</p>
</blockquote>
<p>以及</p>
<blockquote>
<p>C = \sum_{i=1}^n cos(a_i)
S = \sum_{i=1}^n sin(a_i)</p>
</blockquote>
<p>scipy库通过</p>
^{pr2}$
<p>这有点难理解。
如果我们假设样本是零均值,范围是[0,2*pi],并且使用默认轴(在示例中都是真的),可以将其简化为</p>
<pre><code>S = mean(sin(samples))
C = mean(cos(samples))
R = hypot(S, C)
V = 2 * log(1/R)
</code></pre>
<p>所以scipy使用的定义是通过2*log(1/R)而不是1-R来转换R。
这似乎很奇怪。
纵观历史,<a href="https://github.com/scipy/scipy/blame/v1.1.0/scipy/stats/morestats.py#L2696-L2733" rel="noreferrer">https://github.com/scipy/scipy/blame/v1.1.0/scipy/stats/morestats.py#L2696-L2733</a>,统计数据一度是用</p>
<pre><code>ang = (samples - low)*2*pi / (high-low)
res = stats.mean(exp(1j*ang))
V = 1-abs(res)
return ((high-low)/2.0/pi)**2 * V
</code></pre>
<p>这似乎符合你提供的定义。
在添加测试的同时,在一个错误修复中改变了这一点,但是没有提到新的计算是从哪里来的。在</p>
<p>关于scipy bug跟踪器的一些讨论可以在<a href="https://github.com/scipy/scipy/pull/5747" rel="noreferrer">https://github.com/scipy/scipy/pull/5747</a>上找到。
这表明这种行为是故意的,不会被纠正。
astropy中还有另一个可用的实现<a href="http://docs.astropy.org/en/stable/api/astropy.stats.circvar.html" rel="noreferrer">http://docs.astropy.org/en/stable/api/astropy.stats.circvar.html</a>,它指出</p>
<blockquote>
<p>The definition used here differs from the one in scipy.stats.circvar. Precisely, Scipy circvar uses an approximation based on the limit of small angles which approaches the linear variance.</p>
</blockquote>
<p>因此,总而言之,由于未知原因,<code>scipy</code>使用了一个近似值(在某些情况下这似乎相当糟糕)。但是,由于向后兼容,它不会被修复,所以您可能需要使用<code>astropy</code>的实现。在</p>