老饼讲解-机器学习 机器学习 神经网络 深度学习
降维算法

【代码】LDA线性判别分析Demo(python-sklearn)

作者 : 老饼 发表日期 : 2023-01-14 10:28:07 更新日期 : 2023-01-14 17:12:31
本站原创文章,转载请说明来自《老饼讲解-机器学习》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 








联系老饼