0

我希望更好地理解 scikit-learn 的 LDA 对象返回的 covariance_ 属性。

我确定我遗漏了一些东西,但我希望它是与输入数据相关的协方差矩阵。但是,当我将 .covariance_ 与 numpy.cov() 返回的协方差矩阵进行比较时,会得到不同的结果。

谁能帮我理解我错过了什么?感谢并乐于提供任何其他信息。

请在下面找到一个说明差异的简单示例。

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# Sample Data
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
y = np.array([1, 1, 1, 0, 0, 0])

# Covariance matrix via np.cov
print(np.cov(X.T))

# Covariance matrix via LDA
clf = LinearDiscriminantAnalysis(store_covariance=True).fit(X, y)
print(clf.covariance_)
4

1 回答 1

0

sklearn.discrimnant_analysis.LinearDiscriminantAnalysis中,协方差计算如下:

In [1]: import numpy as np 
   ...: cov = np.zeros(shape=(X.shape[1], X.shape[1])) 
   ...: for c in np.unique(y): 
   ...:     Xg = X[y == c, :] 
   ...:     cov += np.count_nonzero(y==c) / len(y) * np.cov(Xg.T, bias=1) 
   ...: print(cov)
array([[0.66666667, 0.33333333],
       [0.33333333, 0.22222222]])  

因此,它对应于每个单独类的协方差之和乘以先验,即类频率。请注意,此先验是 LDA 的参数。

于 2019-12-21T17:48:05.320 回答