Менее полезный ответ будет, поскольку именно так его определяет scipy, поэтому вам лучше попросить разработчиков получить определенный ответ.В самом деле.пример из документов:
from scipy.stats import circvar
circvar([0, 2*np.pi/3, 5*np.pi/3])
2.19722457734
Таким образом, вы не можете сказать, что поведение не обнаружено.Но почему это так?
Ваша вторая ссылка определяет круговую дисперсию для набора из n углов a_1, ... a_n как
V = 1 - \ hat {R_1}
Где
\ hat {R_1} = R_1 / n R_1 = \ sqrt {C ^ 2 + S ^ 2}
и
C = \ sum_ {i = 1} ^ n cos (a_i) S = \ sum_ {i = 1} ^ n sin (a_i)
Библиотека scipy находит круговую дисперсию по
ang = (samples - low)*2.*pi / (high - low)
S = sin(ang).mean(axis=axis)
C = cos(ang).mean(axis=axis)
R = hypot(S, C)
return ((high - low)/2.0/pi)**2 * 2 * log(1/R)
Это немного сложно понять.Если мы предположим, что отсчеты имеют нулевое среднее значение, диапазон равен [0, 2 * pi], и используется ось по умолчанию (все верно в примере), ее можно упростить до
S = mean(sin(samples))
C = mean(cos(samples))
R = hypot(S, C)
V = 2 * log(1/R)
.определение, используемое scipy, преобразует R на 2 * log (1 / R), а не на 1-R.Это кажется странным.Просматривая историю, https://github.com/scipy/scipy/blame/v1.1.0/scipy/stats/morestats.py#L2696-L2733, в один момент статистические данные были рассчитаны с использованием
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
, что соответствует приведенным вами определениям.Это было исправлено в багфиксе в то же время, когда были добавлены тесты, но без какой-либо ссылки на то, откуда появились новые вычисления.
Некоторое обсуждение трескотного баг-трекера доступно по адресу https://github.com/scipy/scipy/pull/5747. Этопредполагает, что поведение является преднамеренным, и не будет исправлено.Есть еще одна реализация, доступная в astropy, http://docs.astropy.org/en/stable/api/astropy.stats.circvar.html,, которая отмечает
Определение, используемое здесь, отличается от определения в scipy.stats.circvar.Точно, Scipy Cirvar использует приближение, основанное на пределе малых углов, которое приближается к линейной дисперсии.
Итак, в итоге, по неизвестным причинам scipy
использует приближение (которое кажется довольно плохимв некоторых случаях).Однако из-за обратной совместимости это не будет исправлено, поэтому вы можете использовать реализацию astropy
.