一、基本代码:
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)