LDA分类器 python

LDA分类器

11分类器主要研究内容

(1)分类器的原理和算法流程;

(2)利用现有的任一公开数据集(自己选取)实现分类器分类

(3)并利用某种评价标准 对分类结果进行分析评判

4原理:利用LDA分类器,将数据在低维度进行投影,并希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大;

(5)本人主要负责组内代码编写及实现的任务,对鸢尾花数据集进行了LDA算法,然后使用LDA方法分析处理了二分类和多分类问题。

12 LDA分类器研究的工作基础或实验条件

(1)手动推演:通过手动推演实现算法流程,并计算出分类结果。

(2)软件环境:通过python来实现算法流程来验证手动推演结果,并且画出分类结果图。

13 设计思想

输入:数据集其中任意样本Xi为n维向量,降维到的维度是d。

输出:降维后的数据集。

(1)计算类内散度矩阵Sw

(2)计算类间散度矩阵Sb

(3)计算矩阵

(4)求出第三步的矩阵的特征值和特征向量,按从小到大的顺序选择前d个特征值和对应的特征向量,从而求得投影矩阵W

(5)对样本集中的每一个样本特征xi,转化为新的样本

(6)最后得出输出样本集

14 流程图

15 主要程序代码

import numpy as np

import matplotlib.pyplot as plt

from sklearn import datasets

def LDA(X, y):

    # 根据y等于01分类

    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)

    # 重新计算 X1X2y1,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()

16 运行结果及分析

线性判别分析(Linear Discriminant Analysis, LDA)是一种经典的线性学习方法,思路是将两种数据投影到一条直线上,使这两种数据之间尽可能远离,且同类数据尽可能聚集在一起。我们小组最终的结果完美的验证了LDA算法的思想。

你可能感兴趣的:(1024程序员节,机器学习,分类,python,开发语言)