我有一个数据编码到每个集群,我正在尝试计算每个集群的经验均值和方差。我将使用
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
在这两种情况下,我都想知道我在哪里做错了。另外,如果有更好的编码方法,我会很高兴知道。
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
这里是正确的代码,不客气)