scipy.spatial.distance.

jensenshannon#

scipy.spatial.distance.jensenshannon(p, q, base=None, *, axis=0, keepdims=False)[source]#

計算兩個機率陣列之間的 Jensen-Shannon 距離(度量)。這是 Jensen-Shannon 散度的平方根。

兩個機率向量 pq 之間的 Jensen-Shannon 距離定義為:

\[\sqrt{\frac{D(p \parallel m) + D(q \parallel m)}{2}}\]

其中 \(m\)\(p\)\(q\) 的逐點平均值,而 \(D\) 是 Kullback-Leibler 散度。

如果 pq 的總和不為 1.0,此常式將會正規化它們。

參數:
p(N,)array_like

左機率向量

q(N,)array_like

右機率向量

basedouble,選用

若未給定,則為用於計算輸出的對數基底,否則此常式將使用 scipy.stats.entropy 的預設基底。

axisint,選用

計算 Jensen-Shannon 距離的軸。預設值為 0。

在 1.7.0 版本中新增。

keepdimsbool,選用

若設定為 True,縮減的軸將保留在結果中,作為大小為一的維度。使用此選項,結果將會針對輸入陣列正確廣播。預設值為 False。

在 1.7.0 版本中新增。

回傳值:
jsdouble 或 ndarray

沿著 axispq 之間的 Jensen-Shannon 距離。

註解

在 1.2.0 版本中新增。

範例

>>> from scipy.spatial import distance
>>> import numpy as np
>>> distance.jensenshannon([1.0, 0.0, 0.0], [0.0, 1.0, 0.0], 2.0)
1.0
>>> distance.jensenshannon([1.0, 0.0], [0.5, 0.5])
0.46450140402245893
>>> distance.jensenshannon([1.0, 0.0, 0.0], [1.0, 0.0, 0.0])
0.0
>>> a = np.array([[1, 2, 3, 4],
...               [5, 6, 7, 8],
...               [9, 10, 11, 12]])
>>> b = np.array([[13, 14, 15, 16],
...               [17, 18, 19, 20],
...               [21, 22, 23, 24]])
>>> distance.jensenshannon(a, b, axis=0)
array([0.1954288, 0.1447697, 0.1138377, 0.0927636])
>>> distance.jensenshannon(a, b, axis=1)
array([0.1402339, 0.0399106, 0.0201815])