(十一)分别使用PCA和LDA降维到二维平面并可视化[机器学习代码]

博客主要介绍了如何使用PCA和LDA将UCI手写体数字集的3类样本降维到二维,并进行可视化。文章提到LDA降维效果不理想,邀请读者探讨原因。内容包括问题需求、代码实现和总结,鼓励读者互动交流。
摘要由CSDN通过智能技术生成

    机器学习课程总结,本系列文章代码注释为主。
    理论部分搬至博客上比较耗费时间,所以缺少理论部分。但是也欢迎大家一起探讨学习。
    如果需要理论部分的讲义,可私信(个人觉的讲的很好很全)。

文章目录

问题需求

从UCI手写体数字集中随机挑选3类,分别使用PCA和LDA降维到二维平面,每类随机挑选20个样本进行可视化,可视化时不同类别使用不同颜色进行区分,并使用图例进行类别说明。

代码

  • 对于LDA降维效果很差,没有找到合理的解释,欢迎补充
    在这里插入图片描述
    在这里插入图片描述
# -*- coding: utf-8 -*-#
# Author: xhc
# Date:    2021-06-18 22:04
# project:  0618
# Name:    LDA_PCA比较.py

from sklearn.decomposition import PCA
from read_data import read_from_txt
import random
import matplotlib.pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
filename = ('./data/UCI_digits.train')
X,_,Y = read_from_txt(filename,Dim1 = 1024,Dim2 = 64)

model_pca = PCA(n_components=2) # n_components维度
x_pca = model_pca
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
LDA(Linear Discriminant Analysis)是一种常用的线性降维方法,通常用于特征提取和分类问题。LDA降维的同时能够保留数据的类别信息,因此在二分类问题特别有用。下面是使用matlab实现二分类LDA降维的步骤: 1. 准备数据 首先需要准备二分类数据集,每个数据点包含多个特征。假设有m个数据点和n个特征,可以将数据存储在一个m x n的矩阵X,每行代表一个数据点,每列代表一个特征。同时还需要将数据的类别(即标签)存储在一个m x 1的向量y,其y(i)表示第i个数据点的类别。 2. 计算均值向量 对于每个类别,计算其所有数据点特征的均值向量。可以使用matlab的mean函数来计算。 3. 计算类内散度矩阵 对于每个类别,计算其所有数据点特征与对应均值向量之间的差异。将这些差异向量按列组成一个矩阵Si,可以使用matlab的bsxfun函数来实现。然后计算该矩阵的协方差矩阵Ci,可以使用matlab的cov函数来计算。最后将所有类别的Ci相加得到总的类内散度矩阵Sw。 4. 计算类间散度矩阵 计算所有数据点的总均值向量mi和每个类别的均值向量之间的差异向量。将这些差异向量按列组成一个矩阵Sb,可以使用matlab的bsxfun函数来实现。然后计算该矩阵的协方差矩阵Cb,可以使用matlab的cov函数来计算。最后将Sb和Cb相乘得到总的类间散度矩阵Sb。 5. 计算投影矩阵 计算Sw和Sb的特征值和特征向量,可以使用matlab的eig函数来计算。将特征值从大到小排序,并选择前k个特征向量组成投影矩阵W,其k为降维后的数。 6. 降维 将数据矩阵X乘以投影矩阵W得到降维后的数据矩阵Y,即Y=XW。 下面是一个简单的matlab代码实现: ``` % 准备数据 load fisheriris X = meas(1:100,:); y = [ones(50,1); -ones(50,1)]; % 计算均值向量 mu1 = mean(X(y==1,:)); mu2 = mean(X(y==-1,:)); % 计算类内散度矩阵 S1 = bsxfun(@minus, X(y==1,:), mu1); S2 = bsxfun(@minus, X(y==-1,:), mu2); Sw = cov(S1) + cov(S2); % 计算类间散度矩阵 mu = mean(X); Sb = (mu1-mu)'*(mu1-mu) + (mu2-mu)'*(mu2-mu); % 计算投影矩阵 [V, D] = eig(Sb, Sw); [~, idx] = sort(diag(D), 'descend'); W = V(:, idx(1:1)); % 降维 Y = X*W; ``` 在以上代码使用了鸢尾花数据集作为示例数据,其前50个数据点属于类别1,后50个数据点属于类别-1。代码降维后的数设置为1,即将原来的4数据降到1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Windalove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值