线性判别分析(LDA)是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。LDA的思想可以用一句话来概述,就是“投影后类内方差最小,类间方差最大”,也就是投影后希望每一种类别数据的投影点尽可能地接近,而不同类别的数据的类别中心之间的距离尽可能的大。(高内聚,低耦合)
- 对d维数据进行标准化处理(d为特征数量)
- 对每一类别,计算d维的均值向量
- 构造类间的散步矩阵和类内的散步矩阵
- 计算矩阵的特征值和对应的特征向量
- 选取前k个特征值对应的特征向量,构造一个d x k维的转换矩阵W,特征向量以列的形式排列
- 使用转换矩阵W将样本映射到新的特征子空间上
程序如下:
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy
import pandas as pd
fp=open('seeds_dataset.txt','r')
ls=[]
for line in fp:
line=line.strip('\n') #将\n去掉
ls.append(line.split('\t')) #将空格作为分隔符将一个字符切割成一个字符数组
fp.close()
ls=numpy.array(ls,dtype=float) #将其转换成numpy的数组,并定义数据类型为float
print(ls)
# 将文件转为DataFrame表格
ls_pd = pd.DataFrame(ls)
y = ls_pd.loc[:,7]
进行数据预处理
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
data_std = sc.fit_transform(ls_pd.loc[:,1:6])
调用sklearn中的LDA
data_LDA = LinearDiscriminantAnalysis(n_components=2).fit_transform(data_std, y)
将结果画出
plt.figure(figsize=(8,4))
plt.title("sklearn_LDA")
plt.scatter(data_LDA[:, 0], data_LDA[:, 1], c = y)
plt.savefig("LDA.png",dpi=600)
plt.show()
另:
plt.figure(figsize=(8,4))
plt.title("sklearn_LDA")
plt.scatter([1,2,3], [4,5,6], c = [1,2,1])
# 可以用这种方法画出某几类颜色的圆点