机器学习实验------PCA

目录

一、介绍

二、算法流程

(1)数据中心化

(2)计算协方差矩阵

(3)特征值分解

(4)选择特征

 三、运行结果展示

四、实验中遇到的问题

五、PCA的优缺点

优点:

缺点:

六、总代码


一、介绍

PCA(principal components analysis)即主成分分析技术,又称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。

 本使用采用的是鸢尾花数据集,需要把鸢尾花的四个数据特征转化为两个数据特征使得他可以在坐标轴上面显示出来。

二、算法流程

(1)数据中心化

对原始数据进行中心化处理,即将每个特征的值减去该特征的均值,以保证数据的均值为零。

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

也就是说将每个数据减去他的平均值得到新的数据。代码先计算他的平均值,再对每个数据减去他的平均值。

(2)计算协方差矩阵

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

公式:\text{cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{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 \Lambda V^{-1}

其中V就是特征值,lambda就是特征向量。

学习了代码后使用QR分解法来求解特征值和特征向量。

原理:

上三角形是对角线下方的值全部为零,上三角形的对角线就是他的特征值。我们通过不断把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
  1. 初始化特征向量为单位矩阵
  2. 迭代num次使得
  3. 对矩阵A进行 QR 分解,得到正交矩阵Q和上三角矩阵R,不断对特征向量进行更新A成为他的相似矩阵。
  4. 非对角线元素的范数,如果小到一定值,就说明更新差不多完成了,就退出循环。
  5. 最后特征值就是A对角线上的值,特征向量就是累乘。

(4)选择特征

我们已经得到了特征向量,先对他进行排序,选择最大的几个成分当作主成分,然后与中心化的X_pj相乘得到新的、降维后的数据集,然后就可以对降维后的数据集进行操作了。

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()

 将y的标签映射为数值。并且需要加上plt.rcParams['font.sans-serif'] = ['SimHei']和rcParams['axes.unicode_minus'] = False来保证中文和负号在图像中正常显示

四、实验中遇到的问题

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

五、PCA的优缺点

优点:

  1. PCA可以将高维数据转化为低维,从而减少数据维度。可以降低计算复杂性和存储需求。
  2. PCA可以保留数据中最重要的特征,并且去除噪声和冗余信息。

缺点:

  1. PCA假设数据之间的关系是线性的,因此它可能无法有效处理非线性关系的数据。 

  2. 对于非常大的数据集,计算协方差矩阵和进行特征分解可能会非常耗时且计算复杂度较高。
  3. 在降维的过程中保留的主成分不可能包含所有信息,不可避免的的导致信息模糊,丢失。

六、总代码

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700540.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macbook本地部署 pyhive环境连接 hive用例

前言 公司的测试和生产环境中尚未提供基于Hive的客户端。若希望尝试操作Hive表&#xff0c;目前一个可行的方案是使用Python语言&#xff0c;通过借助pyhive库&#xff0c;您可以对Hive表进行各种操作。以下是一些示例记录供您参考。 一、pyhive是什么&#xff1f; PyHive是一…

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层&#xff08;运输层概述&#xff09; 运输层运输层端口号复用分用复用&#xff08;Multiplexing&#xff09;分用&#xff08;Demultiplexing&#xff09; 常用端口号页面响应流程 我们今天进入到运输层的学习&#xff1a; 运输层 我们之前学习的物理层…

Vitis HLS 学习笔记--矢量数据类型

目录 1. 简介 2. 用法详解 2.1 存储器布局 2.2 示例展示 2.3 综合报告 3. 总结 1. 简介 在 Vitis HLS 中&#xff0c;矢量数据类型是一种特殊的数据类型&#xff0c;它允许你一次处理多个数据元素&#xff0c;就像一排并排的盒子&#xff0c;每个盒子里都装着一个数据元…

短视频矩阵源码---矩阵托管1000个账号如何正规开发规则实现

一、短视频矩阵源码开发实现规则&#xff1a; 1.首先是确保各个官方平台api接口的稳定性&#xff0c;一定要是各个平台正规的api 2.其次是保证服务器运行&#xff0c;带宽保证能够并行&#xff0c;目前我们这边用的是源码所需服务器配置&#xff1a;规格:最低8核16G2、硬盘:系…

易舟云财务软件:引领财务数字化转型的新篇章

在数字化浪潮的推动下&#xff0c;财务软件已经成为企业财务管理不可或缺的工具。而易舟云财务软件&#xff0c;作为一款深受用户喜爱的财务管理系统&#xff0c;正引领着财务数字化转型的新篇章。 财务软件行业背景与易舟云的定位 财务软件行业正经历着前所未有的变革。随着《…

视频行人搜索 (Person Search in Videos)

文章目录 视频行人搜索 (Person Search in Videos)图像行人搜索存在问题Video PS 定义MTA-PS数据集First person search dataset in videosComplicated ambient conditions and realistic monitoring scenariosPrivacy insensitivity 方法 视频行人搜索 (Person Search in Vide…

数字芯片——时钟与复位

关于此次章节我想要探讨的问题是门控时钟的处理&#xff08;Clock Gating Methodology&#xff09;和时钟复位策略。在低功耗设计中&#xff0c;门控时钟是结构最简洁&#xff0c;最容易实现的电路结构。如上期所讲的&#xff0c;一个控制信号和时钟逻辑与在一起输出的信号作用…

万界星空科技定制化MES系统,实现数字化生产

一、MES生产管理系统强调三个方面&#xff1a; 1、MES是对整个车间制造过程的优化&#xff0c;而不是单一的解决某个生产瓶颈。 2、MES必须提供实时收集生产过程中数据的功能&#xff0c;并作出相应的分析和处理。 3、MES需要与计划层和控制层进行信息交互&#xff0c;通过企业…

程序员,真有不变的技术和稳定的工作吗?

在程序员这个充满变化和创新的领域&#xff0c;很多人追求“稳定”的工作&#xff0c;认为找到一个合适的公司和岗位就能安心一辈子。然而&#xff0c;技术的快速更新迭代和市场需求的不断变化&#xff0c;使得真正的稳定变得越来越难以捉摸。作为程序员&#xff0c;我们需要反…

C# Winform内嵌窗体(在主窗体上显示子窗体)

在开发Winform项目中&#xff0c;经常会要切换不同的窗体。通常程序都有一个主窗体&#xff0c;在切换窗体时往往需要关闭其他子窗体&#xff0c;这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。 MDI主窗体要设置一个比较重要的属性&#xff0c;IsMdiContainertrue。子窗体的…

【云原生】创建harbor私有仓库及使用aliyun个人仓库

1.安装docker #删除已有dockersystemctl stop docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #安装docker yum install -y docker-ce-20.10.1…

NLP中的Tokenizer分词器的概念与实现

Tokenizer 在开始学习 NLP 相关知识之前&#xff0c;先要学习一个叫 Tokenizer 的概念&#xff0c;这可谓是所有 NLP 模型开始训练前需要做的一个步骤&#xff0c;那么 Tokenizer 是什么&#xff1f; 在计算机处理一行语句的时候&#xff0c;我们给其输入一个 String&#xff…

Android Media Framework(五)Tunnel Mode

本篇将聚焦Android Tunnel Mode&#xff0c;详细解析组件之间隧道连接过程、数据传递过程、组件销毁过程。通过阅读本篇内容&#xff0c;我们应能对tunneled组件的连接过程和buffer分配过程有所了解。 1、Tunnel Mode介绍 IL Spec详细描述了Tunnel Component的实现方式&#x…

【ArcGISProSDK】OpenItemDialog打开文件对话框

打开单个文件 效果 代码 public async void OpenFunction() {// 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;OpenItemDialog openItemDialog new OpenItemDialog() { Title "打开要素文件",InitialLocation gdbPath,Filter ItemFilte…

Linux 性能优化实战

文章目录 33 | 关于 Linux 网络&#xff0c;你必须知道这些&#xff08;上&#xff09;设计高并发架构需要考虑什么&#xff1f;如何理解分布式&#xff1f;如何理解云计算&#xff1f;如何理解微服务&#xff1f;TCP/IP网络分层模型是什么&#xff1f;每一层的功能是什么&…

矩阵练习2

48.旋转图像 规律&#xff1a; 对于矩阵中第 i行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第i 列的第 j 个位置。 matrix[col][n−row−1]matrix[row][col] 可以使用辅助数组&#xff0c;如果不想使用额外的内存&#xff0c;可以用一个临时变量 。 还可以通…

STM32项目分享:智能窗帘系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

基于VLC可见光通信的室内光通信信道信噪比分析matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... % 接收功率计算Pr …

使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析

使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析 本文将介绍如何使用pyspark以及scala实现的spark分析出租车GPS数据&#xff0c;具体来说&#xff0c;我们将计算每个北京城区内的车辆位置点数&#xff0c;以及统计出租车的数量。我们将使用两…

Vue 3与ESLint、Prettier:构建规范化的前端开发环境

title: Vue 3与ESLint、Prettier&#xff1a;构建规范化的前端开发环境 date: 2024/6/11 updated: 2024/6/11 publisher: cmdragon excerpt: 这篇文章介绍了如何在Vue 3项目中配置ESLint和Prettier以统一代码风格&#xff0c;实现代码规范性与可读性的提升。通过设置规则、解…