在LDA分析后绘制置信区间: 我应该使用所有类共享的协方差矩阵(lda.covariance_),还是应该计算并使用每个类的协方差矩阵?
前段时间,我问了一个关于如何在点周围绘制椭圆的问题:Draw ellipses around points
这些椭圆将代表线性判别分析(LDA)数据点的置信区间。
我将重复使用我从科学出版物中获得的旧图片:
在LDA计算之后,红点(例如)可以定义如下:
[[-23.88315146 -3.26328266] # first point
[-25.94906669 -1.47440904] # second point
[-26.52423229 -4.84947907]] # third point
你可以在图片上看到红点被椭圆包围,这表示红点均值的置信区间(在某个水平)。
这是我想要获得的。现在scikit-learn的doc有一个例子(here):
def plot_ellipse(splot, mean, cov, color):
v, w = linalg.eigh(cov)
u = w[0] / linalg.norm(w[0])
angle = np.arctan(u[1] / u[0])
angle = 180 * angle / np.pi # convert to degrees
# filled Gaussian at 2 standard deviation
ell = mpl.patches.Ellipse(mean, 2 * v[0] ** 0.5, 2 * v[1] ** 0.5,
180 + angle, color=color)
这个函数就像这样调用:
plot_ellipse(splot, lda.means_[0], lda.covariance_, 'red')
在doc的示例中,调用plot_ellipse
来绘制所有类的置信区间,始终使用相同的协方差:lda.covariance
。
lda.covariance
来确定椭圆的角度。由于lda.covariance
永远不会改变,所有椭圆将具有相同的角度。
这样做在数学上是否正确?我很想说不。
在与LDA无关的另一篇文章(multidimensional confidence intervals)上,@ Joe Kington只使用了“分散点的2-sigma椭圆”。他计算每个班级的协方差:
cov = np.cov(points, rowvar=False)
,例如,points
将是上述3点。然后他使用类似的方法计算椭圆的角度。但是当他计算每个类的协方差矩阵时,椭圆的角度在各个类别之间并不相同。