首页 > 其他分享 >第七章 线性判别分析LDA(7.1)

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

时间:2024-06-16 13:29:17浏览次数:10  
标签:iris LDA plt target r2 判别分析 类别 7.1 test

一、基本代码:

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)

标签:iris,LDA,plt,target,r2,判别分析,类别,7.1,test
From: https://blog.csdn.net/weixin_66403225/article/details/139705428

相关文章

  • solidity calldata学习
    在Solidity中,calldata是一种数据位置标识符,用于指定函数参数的存储位置。calldata特别适用于函数的外部调用参数,并且是只读的。以下是对Solidity中数据位置的一些说明:storage:用于状态变量,数据持久存储在区块链上。修改状态变量会消耗gas。memory:用于临时变量,这些变量......
  • 模拟集成电路设计系列博客——7.1.6 多比特SAR ADC
    7.1.6多比特SARADC我们目前讨论的逐次逼近型ADC在每个周期都通过单次的比较将搜索空间一分为二。这个搜索可以通过在每个周期进行多次比较来实现加速,每次将搜索空间切分为更小的区域。例如,如果我们想要猜测一个1到128之间的数时,我们除了提问“这个数是否大于64”,还可以同时提问......
  • 模拟集成电路设计系列博客——7.1.5 SAR ADC中的错误纠正
    7.1.5SARADC中的错误纠正片上部件的最佳匹配精度可以达到百分之0.1,但是这对于有着10比特及以上精度的SARADC来说仍然不够,因此需要一种校正手段。其中一种用于获得16比特线性ADC的错误纠正方式如下图所示[Lee,1984]:在这种方式中,MSB部分通过二进制权重电容阵列来实现,例如,这个......
  • 模拟集成电路设计系列博客——7.1.4 电荷重分布SAR ADC的速度估计
    7.1.4电荷重分布SARADC的速度估计电荷重分布SARADC的主要速度限制来自于电容阵列和开关构成的RC时间常数。为了估计这个时间,考虑电容阵列复位后的简化模型,如下图所示:此处\(R\),\(R_{s1}\)和\(R_{s2}\)表示位线,\(S_1\)和\(S_2\)开关上的开态电阻,相对的,尽管这个电路很容易就可......
  • 模拟集成电路设计系列博客——7.1.3 电阻电容混合SAR ADC
    7.1.3电阻电容混合SARADC在DAC中组合使用电阻串和电容阵列的方式同样可以在ADC中使用,一种实现[Fotouhi,1979]如下图所示:第一步是将所有的电容都充电到\(V_{in}\)并重置比较器,接着,通过逐次逼近的方式来查找两个相邻的电阻节点具有大于和小于\(V_{in}\)的电压。使用两根总线,分......
  • 模拟集成电路设计系列博客——7.1.2 基于电荷重分布的SAR ADC
    7.1.2基于电荷重分布的SARADC实现SARADC最直接的方式是使用一个独立的DAC,并将其设置等于输入电压(在一个LSB范围内)进而修改流程图如下:首个用这种方式实现的开关电容模拟系统即所谓的电荷重分布MOSADC[McCreary,1975]。通过这个转换器,采样和保持电路,DAC,以及比较器被组合在了......
  • LocalDateTime工具-LocalDateTimeUtil
    介绍从Hutool的5.4.x开始,Hutool加入了针对JDK8+日期API的封装,此工具类的功能包括LocalDateTime和LocalDate的解析、格式化、转换等操作。使用日期转换StringdateStr="2020-01-23T12:23:56";DateTimedt=DateUtil.parse(dateStr);//Date对象转换为LocalDateTimeLocalD......
  • java8之后为神马舍弃Date拥抱LocalDateTime
    在Java开发中,我们经常需要处理与时间和日期相关的任务。多年来,java.util.Date类一直是处理日期和时间的主要工具。然而,随着Java8的发布,我们有了更好的选择:java.time包中的LocalDateTime类。在本文中,我们将探讨为什么在现代Java开发中,推荐使用LocalDateTime而不是Date。1.不可变......
  • 模拟集成电路设计系列博客——7.1.1 逐次比较型ADC基本介绍
    7.1.1逐次比较型ADC基本介绍实现数模转换器(ADC)的架构可以粗略的分成三种,如下表所示,分别为低到中速ADC,中速ADC和高速ADC:在开始之前,需要注意在讨论ADC设计时,我们一般会忽略AD传输特性中的0.5LSB偏移。采用这个简化是为了不将暂时的概念复杂化。许多转换器架构大量使用了开关电容......
  • Visual Studio 2022 v17.10 发布
    VisualStudio2022版本17.9 现已发布,带来了IDE各个领域的一系列性能增强。一些显着的改进包括:更快的WindowsFormsdesigner加载、更快的Razor着色、更快的解决方案加载以及减少的DLL开销。WindowsFormsdesigner加载速度此前有反馈称,在针对.NETC......