簡體   English   中英

python - 不同長度的 numpy 數組上的 KL 散度

[英]python - KL divergence on numpy arrays with different lengths

我正在為兩個不同的 numpy 數組使用 KL-divergence 的 SciPy 實現([ http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.stats.entropy.html] )。

第一個,假設“base_freq”的標准長度為 2000 第二個, “test_freq”長度可以根據樣本采用不同的值。 所以假設它的長度是 8000。

當這兩個長度不相同時,如何計算 KL 散度???

我的想法是將第二個數組 ( "test_freq" )分解為多個長度為 2000 的數組。 但是這是怎么做到的?? “test_freq”獲得長度為 250 的樣本時會發生什么?

我應該先說我不是信息論專家。 對於我使用 KL 散度的一個應用程序,我正在逐像素比較兩個圖像以計算丟失的位數。 如果圖像具有不同的尺寸,您提出的方法將要求對於較小圖像中的每個像素,我選擇較大圖像中的相應像素 - 而不是任何舊像素。 我的理解是,KL 散度僅在您比較以相同方式采樣的兩個信號(即相同的時間或空間采樣間隔)時才有意義。

如果你想按照你的建議去做,你可以使用numpy.random.choice

import numpy as np

def uneven_kl_divergence(pk,qk):
    if len(pk)>len(qk):
        pk = np.random.choice(pk,len(qk))
    elif len(qk)>len(pk):
        qk = np.random.choice(qk,len(pk))
    return np.sum(pk * np.log(pk/qk))

免責聲明:我不是統計專家。

KL-Divergence 是概率分布之間的度量。 這意味着您必須確保熵函數的輸入是來自同一樣本空間的兩個有效概率分布。

在您的情況下,您有有限數量的可能值,因此您有一個離散隨機變量。 這也意味着您的變量的每個結果都可以通過多次試驗的出現頻率來衡量。

讓我給你舉個簡單的例子。 假設您的隨機變量代表具有 6 種可能結果(6 面)的非完美骰子。 你擲骰子 100 次。

想象一下,您有以下繪圖分布:

1: 10 times
2: 12 times
3: 08 times
4: 30 times
5: 20 times
6: 20 times

由於每個結果(邊)發生了多次,您只需將每個結果計數除以 100。這是您的頻率,這也是您的概率。

所以我們現在有:

P(side=1) = 10/100 = .10
P(side=2) = 12/100 = .12
P(side=3) = 08/100 = .08
P(side=4) = 30/100 = .30
P(side=5) = 20/100 = .20
P(side=6) = 20/100 = .20

最后,這是您的概率分布:

[.10, .12, .08, .30, .20, .20]

請注意,它總和為 1,因為它是概率分布的預期值。

如果您進行第二次實驗並得出不同的概率分布,它仍然有 6 個概率,即使您這次的試驗次數不是 100。

這就是說比較來自不同樣本空間的兩個概率分布是沒有意義的。 如果您有一種從樣本空間轉換到另一個樣本空間的方法,那將是可能的。 但是,請確保您的概率分布是來自同一樣本空間的表示。 比較 6 面骰子和 8 面骰子的概率是沒有意義的,因為它們代表的不是同一個東西。

在一些文章中,我看到人們在計算 KL 散度之前計算數組的直方圖

a = torch.tensor(np.histogram(np.array([0.1, 0.2, 0.3]))[-1])
b = torch.tensor(np.histogram(np.array([0.2, 0.4]))[-1])
loss = nn.KLDivLoss()
dist = loss(a, b)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM