线性判别分析 - 随机生成数的降维——Python

任务描述

本关任务:使用 python 实现 LDA 并对给定数据进行降维。

相关知识

为了完成本关任务,你需要掌握:1.线性判别分析算法思想,2.二类线性判别分析算法原理,3.线性判别分析算法流程。

线性判别分析算法思想
LDA 的思想分析非常朴素:给定训练样本集,设法将样本投影到一条直线上,使得同类样本的投影点尽可能接近、异类样本点的投影点尽可能远离。在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定样本的类别。示意图如下:
线性判别分析 - 随机生成数的降维——Python_第1张图片
用一句话来概括 LDA 思想就是:投影后类内方差最小,类间方差最大。

二类线性判别分析算法原理
线性判别分析 - 随机生成数的降维——Python_第2张图片
线性判别分析 - 随机生成数的降维——Python_第3张图片
线性判别分析 - 随机生成数的降维——Python_第4张图片
线性判别分析算法流程
在这里插入图片描述
算法流程如下:

划分出第一类样本与第二类样本  
获取第一类样本与第二类样本中心点  
计算第一类样本与第二类样本协方差矩阵  
计算类内散度矩阵  
计算w  
计算新样本集

编程要求

根据提示,在右侧编辑器的 begin-end 之间补充代码,实现 LDA 方法。

测试说明

程序会调用你实现好的方法对随机生成的二维数据进行降维,若处理后数据与正确数据 l2 距离小于 10,则视为通关,否则输出你处理后的数据。

代码

#encoding=utf8 
import numpy as np
from numpy.linalg import inv
def lda(X, y):
    '''
    input:X(ndarray):待处理数据
          y(ndarray):待处理数据标签,标签分别为0和1
    output:X_new(ndarray):处理后的数据
    '''
    #********* Begin *********#
    #划分出第一类样本与第二类样本
    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])
    #获取第一类样本与第二类样本中心点
    center1 = np.mean(X1, axis=0)
    center2 = np.mean(X2, axis=0)
    #计算第一类样本与第二类样本协方差矩阵(类内离散度矩阵)
    cov1 = np.dot((X1 - center1).T, (X1 - center1))
    cov2 = np.dot((X2 - center2).T, (X2 - center2))
    #计算类内散度矩阵
    sw = cov1 + cov2
    #计算w
    w = np.dot(inv(sw), (center1 - center2).reshape((len(center1), 1)))
    #计算新样本集
    X_new = np.dot(X, w)
    #********* End *********#
    return X_new

你可能感兴趣的:(模式识别,python,机器学习,numpy)