我使用来自scikit-learn
机器学习库(Python)的线性判别分析(LDA)进行降维,并对结果有些好奇。我现在想知道LDA scikit-learn
正在做什么,以便使结果看起来不同于例如手动方法或R中完成的LDA。如果有人可以在这里给我一些见解,那将是非常不错的。
基本上最令人担忧的是,该图scikit-plot
显示了两个变量之间的相关性,其中应该有一个相关性0。
为了进行测试,我使用了虹膜数据集,前两个线性判别式如下所示:
IMG-1。通过scikit-learn进行LDA
这基本上与我在scikit-learn 文档中找到的结果一致。
现在,我逐步进行了LDA,并得到了不同的预测。我尝试了不同的方法,以了解发生了什么事情:
IMG-2。基于原始数据的LDA(无中心,无标准化)
如果我先对数据进行标准化(z分数归一化;单位方差),这将是分步方法。我只用均值中心进行了相同的操作,这应该导致相同的相对投影图像(并且确实如此)。
IMG-3。均值居中或标准化后的逐步LDA
IMG-4。R中的LDA(默认设置)
我将数据居中的IMG-3中的LDA(这将是首选方法)看起来也与我在R中执行LDA的人在帖子中找到的LDA完全相同
参考代码
我不想将所有代码粘贴到这里,但是我将其作为IPython笔记本上传到这里,该笔记本分为我用于LDA投影的几个步骤(请参见下文)。
- 步骤1:计算d维平均向量
步骤2:计算散点矩阵
2.1类内散布矩阵由以下等式计算:
2.2类间散布矩阵由以下公式计算: 其中是整体平均值。
步骤3.求解矩阵的广义特征值问题
3.1。通过减少特征值对特征向量进行排序
3.2。选择具有最大特征值的k个特征向量。结合两个特征值最高的特征向量来构建维特征向量矩阵
步骤5:将样本转换到新的子空间