第七章 线性判别分析LDA(7.1)

一、基本代码:

sklearn.discriminant_analysis.LinearDiscriminantAnalysis(solver='svd',shrinkage=None,priors=None,n_components=None,store_covariance=False,tol=0.0001,covariance_estimator=None)[source]

参数介绍:

参数:
priors:一个数组,数组中的元素依次指定了每个类别的先验概率。如果为None,
则认为每个类的先验概率都是等可能的。
n_compinents:一个整数。指定了数组降维后的维度(该值必须小于n_classes-1)

coef _: 权重向量。
intercept:截距值。
covariance _: 一个数组,依次给出了每个类别的协方差矩阵。
means _: 一个数组,依次给出了每个类别的均值向量。
xbar _: 给出了整体样本的均值向量。
n_iter _: 实际迭代次数。

方法:
fit(X,y):训练模型。
predict(X):用模型进行预测,返回预测值。
score(X,y[,sample_weight]):返回(X,y)上的预测准确率(accuracy)。
predict_log_proba(X):返回一个数组,数组的元素一次是X预测为各个类
别的概率的对数值。
predict_proba (X):返回一个数组,数组元素一次是x预测为各个类别的概
率值。

例题:LDA方法对Iris数据的降维

一维:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 读取iris数据集,这个数据集的特征维度为4维,样本的类别有三种
iris = datasets.load_iris()
X = iris.data  # 特征数据,150个样本,每个样本4个特征
y = iris.target  # 样本类别标签,共3类(0, 1, 2)
target_names = iris.target_names  # 类别名称('setosa', 'versicolor', 'virginica')

# 将数据的特征维度降为一维
lda = LinearDiscriminantAnalysis(n_components=1)
X_r2 = lda.fit(X, y).transform(X)  # 使用LDA进行降维,结果保存在X_r2中
X_zero = np.zeros(X_r2.shape)  # 创建一个与X_r2形状相同的零数组,用于绘图

# 对每个类别的样本分别绘制散点图
for c, i, target_name in zip('ryb', [0, 1, 2], target_names):
    plt.scatter(X_r2[y == i], X_zero[y == i], c=c, label=target_name)
    # X_r2[y == i]:选取类别为i的样本的降维结果
    # X_zero[y == i]:对这些样本对应的零数组
    # c=c:设置颜色
    # label=target_name:设置图例标签

# 添加网格、图例并显示图表
plt.grid()  # 添加网格线
plt.legend()  # 显示图例
plt.title('LDA of IRIS dataset')  # 添加标题
plt.xlabel('LD1')  # x轴标签
plt.show()  # 显示图表

二维:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 读取iris数据集,这个数据集的特征维度为4维, 样本的类别有三种
iris = datasets.load_iris()
X = iris.data  # 特征数据,150个样本,每个样本4个特征
y = iris.target  # 样本类别标签,共3类(0, 1, 2)
target_names = iris.target_names  # 类别名称('setosa', 'versicolor', 'virginica')

# 将数据的特征维度降为二维
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)  # 使用LDA进行降维,结果保存在X_r2中

# 对每个类别的样本分别绘制散点图
for c, i, target_name in zip('ryb', [0, 1, 2], target_names):
    plt.scatter(X_r2[:, 0][y == i], X_r2[:, 1][y == i], c=c, label=target_name)
    # X_r2[:, 0][y == i]:选取类别为i的样本的降维后第一个LD轴坐标
    # X_r2[:, 1][y == i]:选取类别为i的样本的降维后第二个LD轴坐标
    # c=c:设置颜色
    # label=target_name:设置图例标签

# 添加网格、图例并显示图表
plt.grid()  # 添加网格线
plt.legend()  # 显示图例
plt.title('LDA of IRIS dataset')  # 添加标题
plt.xlabel('LD1')  # x轴标签
plt.ylabel('LD2')  # y轴标签
plt.show()  # 显示图表

分类且测试准确率:

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split

# 读取iris数据集并拆分为训练集和测试集
iris = datasets.load_iris()  # 加载鸢尾花数据集
X = iris.data  # 特征矩阵,包含4个特征
y = iris.target  # 标签向量,包含3个类别(0, 1, 2)
target_names = iris.target_names  # 类别名称('setosa', 'versicolor', 'virginica')

# 将数据集拆分为训练集和测试集,40%的数据用于测试,60%用于训练
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)

# 创建并拟合线性判别分析(LDA)模型
lda = LinearDiscriminantAnalysis(n_components=2)  # 创建LDA对象,指定降维后的维度为2
model = lda.fit(X_train, y_train)  # 使用训练集拟合LDA模型

# 对测试集进行降维
X_test_r2 = model.transform(X_test)  # 转换测试集数据到2维空间

# 使用模型对测试集进行预测
y_pred = model.predict(X_test)  # 预测测试集的类别

# 绘制测试集降维后的散点图
for c, i, target_name in zip('ryb', [0, 1, 2], target_names):
    # c是颜色代码,i是类别索引,target_name是类别名称
    plt.scatter(X_test_r2[:, 0][y_test == i],  # x轴坐标
                X_test_r2[:, 1][y_test == i],  # y轴坐标
                c=c,  # 颜色
                label=target_name)  # 标签

plt.grid()  # 显示网格
plt.legend()  # 显示图例
plt.xlabel('LD1')  # 设置x轴标签
plt.ylabel('LD2')  # 设置y轴标签
plt.title('LDA of IRIS dataset')  # 设置图标题
plt.show()  # 显示图形

# 导入metrics类
from sklearn import metrics

# 生成混淆矩阵
cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(cnf_matrix)  # 打印混淆矩阵

# 打印模型在测试集和训练集上的准确率
test_accuracy = model.score(X_test, y_test)  # 计算测试集准确率
train_accuracy = model.score(X_train, y_train)  # 计算训练集准确率
print('测试集准确率为:', test_accuracy)
print('训练集准确率为:', train_accuracy)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值