一、前言
才知道原来LDA也是被归为“降维”--有标签降维,所以就作为降维部分的源码研究的一部分吧。
这里的源码主体来源于LinearDiscriminantAnalysis类中的方法,以及一系列的辅助方法,删除了一部分功能,如异常提示等,保留了最主体的功能。
二、数据集
鸢尾花数据集,将原本的四维降维到二维。
三、LDA降维算法
这个实在是没有什么好记录的,也是都被讲烂了,直接记录源码,以及和自己实现的进行对比。这里只保留“特征分解”的实现方式,另外两种“SVD”和“最小方差”求解就省略了。
#coding:utf-8
import numpy as np
from sklearn.datasets import load_iris
from sklearn.utils import check_array, check_X_y
from sklearn.utils.multiclass import unique_labels
from sklearn.utils.validation import check_is_fitted
from scipy import linalg
from sklearn.externals.six import string_types
from sklearn.covariance import ledoit_wolf, empirical_covariance, shrunk_covariance
import sys
import matplotlib.pyplot as plt
def empirical_covariance(X, assume_centered=False):
"""Computes the Maximum likelihood covariance estimator
这个就是 “收缩矩阵” 的真面目了!!!
"""
X = np.asarray(X)
covariance = np.cov(X.T, bias=1)
if covariance.ndim == 0:
covariance = np.array([[covariance]])
return covariance
def myCov(X):
'''
自己构建一个不带缩水的协方差矩阵计算方法,比较差别
:param X:
:return:
'''
means = np.mean(X, axis=0)
data = X - means
# 第二步,计算协方差矩阵
cov = np.dot(data.T, data)
print(cov)
def _cov(X, shrinkage=None):
"""Estimate covariance matrix (using optional shrinkage).
估计协方差矩阵(使用可选收缩)
"""
#为什么要进行收缩----解决不可逆问题
#怎么进行 收缩?
shrinkage = "empirical"
if isinstance(shrinkage, string_types):
if shrinkage == 'auto':
sc = St