Calculated Empirical Variance is negative (python, pytorch)

问题描述 投票:0回答:1

我有一个数据编码到每个集群,我正在尝试计算每个集群的经验均值和方差。我将使用

N
作为批大小(换句话说,数据的数量),
D
作为每个数据的维度,以及
K
作为集群的数量。

x
是输入数据,大小为
(N, D)
enc
是数据
x
的单热编码,大小为
(N, D)
enc
的每一行都是一个单热向量。例如,如果
x
的第 i 行在第 k 个簇中,则
enc
的第 i 行将在第 k 列中有 1,而在其他列中有 0。

在我的代码中,我计算了均值和方差如下:

def get_mean_var(x, enc):
    n_K = (torch.sum(enc, dim=0) + 1e-10)[:,None] 
    mu_e = enc.t() @ x / n_K
    encoded_mu = torch.matmul(enc, mu_e)
    var_e = enc.t() @ ((x - encoded_mu ) ** 2) / n_K + 1e-10
    return mu_e, var_e

'n_K' 求和每个簇中的元素数。 'mu_e' 对每个簇求和 'x',然后除以相应的 'n_K'。

encoded_mu
显示每个
mu_e
对应的
x
,然后用于计算
var_e
。 (我只需要协方差的对角线。)我用
1e-10
来防止形式零除法。

但是,在使用这段代码的过程中,我发现

var_e
经常显示负值,据我所知这应该是无效的。

在此之前,我用下面的

var_e
,也显示负值。

var_e = enc.t() @ (x ** 2) / n_K - mu_e ** 2 + 1e-10

在这两种情况下,我都想知道我在哪里做错了。另外,如果有更好的编码方法,我会很高兴知道。

python pytorch covariance variance
1个回答
0
投票

计算经验方差

def empirical_variance(list_numbers): # 计算列表的均值 mean = sum(list_numbers) / len(list_numbers)

# Calculate the squared differences
squared_differences = [ (num - mean)**2 for num in list_numbers ]

# Calculate the empirical variance
empirical_variance = sum(squared_differences) / (len(list_numbers) - 1)

# Return the result
if empirical_variance < 0:
    return 0
else:
    return empirical_variance

这里是正确的代码,不客气)

© www.soinside.com 2019 - 2024. All rights reserved.