首页 > 其他分享 >机器学习之pca

机器学习之pca

时间:2024-06-17 16:32:53浏览次数:10  
标签:特征值 plt 机器 学习 pj tzxl np pca dot

1.pca简介
PCA通过线性变换将高维数据转换为低维数据,同时保留最大的数据方差。这样做的目的是减少数据集的维度,尽可能保留原始数据的信息。

2.算法流程
1.数据中心化
对原始数据进行中心化处理,即将每个特征的值减去该特征的均值,以保证数据的均值为零。
pj = np.mean(X, axis=0)
X_pj = X - pj

2.计算协方差矩阵
找到一个轴,使得样本空间的所有点映射到这个轴的协方差最大。

公式:cov(X,Y)=1/n−1∑ni=1(xi−x¯)(yi−y¯)

n = X.shape[0]
cov = np.dot(X_pj.T,X_pj) / (n - 1)
因为事先已经对他进行了数据中心化,所以得到的协方差就可以不用求解平均值,而直接np.dot(X_pj.T,X_pj)就得到第i个特征和第j个特征的协方差。除以(n-1)是为了得到无偏估计,这样求解准确度会更高。

3.协方差矩阵分解计算特征值和特征向量
对矩阵A进行特征值分解就是将方阵分解为其特征值和特征向量的过程。
公式:A=VΛV−1
原理:
上三角形是对角线下方的值全部为零,上三角形的对角线就是他的特征值。我们通过不断把A进行相似矩阵转化,他的特征值是不会变的,通过迭代多次最后吧矩阵A转化为上三角形,就可以直接得到他的特征值了,特征向量就是变换过程中Q的累乘。

def qr_algorithm(A, num=1000, tol=1e-6):
n = A.shape[0]
tzxl = np.eye(n)

for i in range(num):
    Q, R = np.linalg.qr(A)
    A = np.dot(R, Q)
    tzxl = np.dot(tzxl, Q)

    t = np.sqrt(np.sum(np.square(A) - np.sum(np.square(np.diag(A)))))
    if t < tol:
        break

tzz = np.diag(A)
return tzz, tzxl

使用QR分解的迭代过程逐步将矩阵A转换成上三角矩阵,同时累积了所有的正交变换矩阵,从而得到矩阵A的特征值和特征向量的近似解。
4.选择主成分
t1 = np.argsort(-tzz)
tzxl = tzxl[:, t1]
cnt = 2
zcf = tzxl[:, :cnt]
X1 = np.dot(X_pj, zcf)

5.构建投影矩阵
6.数据投影
7.解释主成分

3.代码展示
1.打印降维度后数据

label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)
print(X1)
plt.rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
plt.scatter(X1[:, 0], X1[:, 1], c=y_encoded, cmap='viridis')
plt.xlabel('主成分一')
plt.ylabel('主成分二')
plt.title('PCA')
plt.show()
将y的标签映射为数值。并且需要加上plt.rcParams['font.sans-serif'] = ['SimHei']和rcParams['axes.unicode_minus'] = False来保证中文和负号在图像中正常显示

四、实验中遇到的问题
因为这个实验的流程相对比较简短,主要的问题就是在特征值分解的理解上,刚开始因为直接计算特征值和特征向量的难度太大,没想到用相似矩阵来求解。后来使用QR分解法迭代求解特征值和特征向量就比较简便。

五.pca的优缺点
优点
1.能够降低模型的复杂度
2.有助于消除特征之间的相关性,减少多重共线性对模型的影响
3.有助于提取保留需要的多个特征
4.pca可以降低到三维或者二维有助于可视化显示
缺点
1.不一定需要,而且可能丢失有用信息
2.对数据线性假设,当数据非线性的时候效果不好
3.计算复杂度较高
4.降维后的特征通常难以解释

六.实验总代码

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from matplotlib import rcParams
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
train_data = pd.read_csv("C:\Users\李烨\Desktop\新建文件夹\6\iris.txt", sep='\s+')

假设数据集的最后一列是目标标签

X = train_data.iloc[:, :-1].values # 特征
y = train_data.iloc[:, -1].values # 标签

pj = np.mean(X, axis=0)
X_pj = X - pj

n = X.shape[0]
cov = np.dot(X_pj.T, X_pj) / (n - 1)

def QR(A, num=1000, tol=1e-6):
n = A.shape[0]
tzxl = np.eye(n)

for i in range(num):
    Q, R = np.linalg.qr(A)
    A = np.dot(R, Q)
    tzxl = np.dot(tzxl, Q)

    t = np.sqrt(np.sum(np.square(A) - np.sum(np.square(np.diag(A)))))
    if t < tol:
        break

tzz = np.diag(A)
return tzz, tzxl

tzz, tzxl = QR(cov)

t1 = np.argsort(-tzz)
tzxl = tzxl[:, t1]
cnt = 2
zcf = tzxl[:, :cnt]
X1 = np.dot(X_pj, zcf)

label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)
print(X1)
plt.rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False
plt.scatter(X1[:, 0], X1[:, 1], c=y_encoded, cmap='viridis')
plt.xlabel('主成分一')
plt.ylabel('主成分二')
plt.title('PCA')
plt.show()

标签:特征值,plt,机器,学习,pj,tzxl,np,pca,dot
From: https://www.cnblogs.com/ls111/p/18252673

相关文章

  • git学习笔记——202406171525
    想将本地仓库代码提交到远程仓库,应注意:如果在新建远程仓库时里面还新建了文件,在本地提交代码时会显示两个分支是冲突的,git认为是两个不相关的仓库代码,会拒绝上传。解决方法是gitpullremotemaster拉取远程代码到本地,然后再gitpushremote-umaster相关链接:https://www.cn......
  • 华为OD机试C卷(100分)-绘图机器(C语言)
    题目描述绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。尝试沿着横线坐标正向绘制直线直到给定的终点E期间可以通过指令在纵坐标轴方向进行偏移,offsetY为正数表示正向偏移,为负数表示负向偏移给定的横坐标终点值E以及若干条绘制指令,......
  • 硬核解读KubeEdge基于大模型边云协同的机器人语义分割算法
    本文分享自华为云社区《KubeEdge:基于大模型边云协同的机器人语义分割算法》,作者:云容器大未来。近年来快速发展的视觉大模型(例如SAM)在促进高精度的智能感知方面具有很大的潜力。然而,边缘环境中的资源限制往往会限制这种视觉大模型在本地部署,从而产生相当大的推理延迟,导致难以......
  • 强化学习科研入门
    强化学习科研入门路线先从深度学习开始想学好强化学习,必要的深度学习基础是不可或缺的,好比盖楼打地基,如果说机器学习是地基,深度学习是钢筋混凝土等支柱,那么,强化学习无疑就是在这些基础上的上层建筑,成熟的强化学习模型,可以在瞬息万变的环境中自主地做出合理的决策,像人一样思考,而......
  • three.js 从零学习
    基本概念场景用来呈现内容的容器我理解就是类似canvas相机记录场景中呈现的内容一般分类两大类1.正投影相机  所有内容同等大小呈现处理2.透视相机 符合人眼逻辑近大远小渲染器决定场......
  • 山东大学2023-2024深度学习期末回忆及参考答案
    文章目录名词解释(3*8=24分)分布式表示超参数共现矩阵截断BPTTattention机制梯度确认疑惑度还有一个忘了简答(6题)1、说出训练数据测试数据验证数据的作用,为什么要分训练数据和测试数据?训练数据、测试数据、验证数据的作用为什么要分训练数据和测试数据2、为什么激活函数要......
  • 2024 第六届机器人与计算机视觉国际会议(ICRCV 2024)即将召开!
    2024第六届机器人与计算机视觉国际会议(ICRCV2024)将于2024年9月20日-22日在中国·无锡召开,由IEEE,IEEERAS,南京理工大学联合主办。会议旨在为行业内专家和学者分享技术进步和业务经验,聚焦机器人与计算机视觉的前沿研究,提供一个合作交流的平台。会议官网:ICRCV2024|......
  • 从事网络安全领域吃香吗?零基础入门精通就业,附学习笔记
    吃香是真的会吃香?但是很辛苦。在安服这行工作是做的痛并快乐着。工作是没有轻松的,都是付出和回报成正比的,而且还要不停学习提升,丝毫不敢懈怠。不可能不加班,能正常作息很难,网络安全系列的岗位是IT行业里最辛苦的,接触了太多圈内同行朋友,基本上都是007,996真是福报奢侈,有时候......
  • Diffusers代码学习:LCM 图生图
    要将LCM用于图像到图像,需要将支持的LCM模型的Checkpoint加载到[UNet2DConditionModel]中,并用[LCMscheduler]替换scheduler程序。然后,可以像往常一样使用管道,并传递文本提示和初始图像,只需4个步骤即可生成图像。# 以下代码为程序运行进行设置importosos.environ["HF_ENDP......
  • STM学习记录(六)————串口的发送接收
    文章目录前言一、串口结构体及库函数二、实现串口发送(库函数)1.程序设计2.代码三.串口接收1.串口接收(普通)2.串口中断接收3.串口发送字符串函数4.串口实现printf(重定向)5.串口实现scanf(重定向)前言一个学习单片机的小白~有错误评论区或私信指出~一、串口结构体及......