LDA分类器
1.1分类器主要研究内容
(1)分类器的原理和算法流程;
(2)利用现有的任一公开数据集(自己选取)实现分类器分类;
(3)并利用某种评价标准 对分类结果进行分析评判;
(4)原理:利用LDA分类器,将数据在低维度进行投影,并希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大;
(5)本人主要负责组内代码编写及实现的任务,对鸢尾花数据集进行了LDA算法,然后使用LDA方法分析处理了二分类和多分类问题。
1.2 LDA分类器研究的工作基础或实验条件
(1)手动推演:通过手动推演实现算法流程,并计算出分类结果。
(2)软件环境:通过python来实现算法流程来验证手动推演结果,并且画出分类结果图。
1.3 设计思想
输入:数据集其中任意样本Xi为n维向量,降维到的维度是d。
输出:降维后的数据集。
(1)计算类内散度矩阵Sw
(2)计算类间散度矩阵Sb
(3)计算矩阵
(4)求出第三步的矩阵的特征值和特征向量,按从小到大的顺序选择前d个特征值和对应的特征向量,从而求得投影矩阵W
(5)对样本集中的每一个样本特征xi,转化为新的样本
(6)最后得出输出样本集
1.4 流程图
1.5 主要程序代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
def LDA(X, y):
# 根据y等于0或1分类
X1 = np.array([X[i] for i in range(len(X)) if y[i] == 0])
X2 = np.array([X[i] for i in range(len(X)) if y[i] == 1])
len1 = len(X1)
len2 = len(X2)
# 求中心点
mju1 = np.mean(X1, axis=0)
mju2 = np.mean(X2, axis=0)
# 求均类内离散度矩阵 形成两个点积
cov1 = np.dot((X1 - mju1).T, (X1 - mju1))
cov2 = np.dot((X2 - mju2).T, (X2 - mju2))
Sw = cov1 + cov2 # 求总的类内离散度矩阵
a = mju1-mju2
a = (np.array([a])).T
# 计算最佳向量
w = (np.dot(np.linalg.inv(Sw), a))
# 计算投影直线
k = w[1]/w[0]
b = 0
x = np.arange(0, 5)
yy = k*x+b
plt.plot(x, yy)
# 重新计算 X1,X2,y1,y2
X1_new = np.dot(X1, w)
X2_new = np.dot(X2, w)
y1_new = [1 for i in range(len1)]
y2_new = [2 for i in range(len2)]
# 创建列表用来接收数据
xi = []
yi = []
for i in range(0, len1):
y0 = X1[i, 1]
x0 = X1[i, 0]
x1 = (k * (y0 - b) + x0) / (k ** 2 + 1)
y1 = k * x1 + b
xi.append(x1)
yi.append(y1)
# print(xi)
# print(yi)
xj = []
yj = []
for i in range(0, len2):
y0 = X2[i, 1]
x0 = X2[i, 0]
x1 = (k * (y0 - b) + x0) / (k ** 2 + 1)
y1 = k * x1 + b
xj.append(x1)
yj.append(y1)
# print(xj)
# print(yj)
plt.grid()
plt.plot(xi, yi, 'r+')
plt.plot(xj, yj, 'b>')
return X1_new, X2_new, y1_new, y2_new
iris = datasets.load_iris()
# 花瓣长度与花瓣宽度 petal length, petal width
X = iris["data"][:, (2, 3)]
y = iris["target"]
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
# print(Sw)
LDA(X, y)
plt.xlabel('花瓣长度')
plt.ylabel('花瓣宽度')
# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()
1.6 运行结果及分析
线性判别分析(Linear Discriminant Analysis, LDA)是一种经典的线性学习方法,思路是将两种数据投影到一条直线上,使这两种数据之间尽可能远离,且同类数据尽可能聚集在一起。我们小组最终的结果完美的验证了LDA算法的思想。