本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
代码说明
本代码展示调用sklearn的LDA线性判别分析包实现数据降维和类别判别的DEMO代码
其中参数solver 代表所使用的求解器,默认值是svd
当 solver = 'svd' 时,使用的算法是类间协方差对角化
当参数 solver = eigen 时,使用的算法是Fisher-LDA
本代码展示两种算法所得到的分类结果与数据转换(降维)结果
LDA算法自实现代码
'''
sklearn使用LDA的例子
'''
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
#加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
#建立线性判别模型
# n_components代表只取两个判别变量
# solver=svd 时,使用的算法是类间协方差对角化
# solver=eigen 时,使用的算法是Fisher-LDA
lda = LinearDiscriminantAnalysis(n_components=2,solver='svd')
# lda = LinearDiscriminantAnalysis(n_components=2,solver='eigen')
#模型求解
md = lda.fit(X, y)
#用训练好的LDA进行数据降维
Xt = md.transform(X)
# 用训练好的LDA进行预测
pred_y = md.predict(X)
print('-----转换后的数据(前5行)-----\n',Xt[0:5,:])
# 各类别在降维后(新特征空间)的分布
plt.figure()
colors = ["navy", "turquoise", "darkorange"]
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
plt.scatter(Xt[y == i, 0], Xt[y == i, 1], alpha=0.8, color=color, label=target_name)
plt.legend(loc="best", shadow=False, scatterpoints=1)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus']=False
plt.rcParams["figure.figsize"] = (9, 4) # 设置figure_size尺寸
plt.title("各类别在降维后(新特征空间)的分布")
plt.show()
运行结果
solver=svd 的结果
当solver=svd 时,使用的算法是类间协方差对角化,
运行结果如下:
-----转换后的数据(前5行)-----
[[ 8.06179978 0.30042062]
[ 7.12868772 -0.78666043]
[ 7.48982797 -0.26538449]
[ 6.81320057 -0.67063107]
[ 8.13230933 0.51446253]]
solver=eigen 的结果
当solver=eigen 时,使用的算法是Fisher-LDA,
运行结果如下:
-----转换后的数据(前5行)-----
[[6.01716893 7.03257409]
[5.0745834 5.9344564 ]
[5.43939015 6.46102462]
[4.75589325 6.05166375]
[6.08839432 7.24878907]]
后面我们再自实现两种算法,并与其对比结果,
以确保自实现的代码与sklearn的是一致的
End