吴恩达机器学习作业-ex7(主成分分析)

data1

导入库,读取数据,并进行可视化数据

import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt#读取数据
path = "./ex7data1.mat"
data = sio.loadmat(path)
# print(data.keys())
X = data.get("X")
# print(X)#可视化数据
plt.scatter(X[:,0],X[:,1])
plt.show()

PCA的第一步就是要对数据预处理,其中最重要的就是均值归一化

均值归一化,x_{j}=\frac{x_{j}-\mu _{j}}{s_{j}},其中\mu _{j}=\frac{1}{m}\sum_{i=1}^{m}x_{j}^{(i)}(均值),s_{j}代表方差。

#将数据标准化再展示
def standardization(X):mean = np.mean(X, axis=0)std = np.std(X, axis=0)return (X - mean) / std

计算协方差矩阵,\sum =\frac{1}{m}\sum_{i=1}^{m}(x^{(i)})(x^{(i)})^{T}

#计算协方差矩阵
def covariance_matrix(X):m = len(X)cov = (X.T @ X)/mreturn cov

计算协方差矩阵的特征向量,[U,S,V]=svd(sigma)(奇异值分解),这里主要要理解U,其中,U是一个n*n的矩阵,因为要降维至k维,所以我们去除矩阵U的前k列,作为k个方向向量,新的特征向量z^{(i)}=U^{T}*x^{(i)},是一个k*1的向量。

#计算协方差矩阵的特征向量
def eigenvector(sigma):U,S,V = np.linalg.svd(sigma)return U,S,V

降维:z^{(i)}=U_{reduce}^{T}*x^{(i)}

#降维
def get_z(X,U,k):U_reduce = U[:,:k]z = X @ U_reducereturn z

压缩重现:x_{approx}\approx U_{reduce}*z

#压缩重现
def reproduces(z,U,k):U_reduce = U[:, :k]X_reproduces = z @ U_reduce.Treturn X_reproduces

调用上述函数

k = 1
X_standardization = standardization(X)
# plt.scatter(X_standardization[:,0],X_standardization[:,1])
# plt.show()
cov = covariance_matrix(X_standardization)
U,S,V = eigenvector(cov)
# print(X_standardization.shape)
# print(U.shape)
z = get_z(X_standardization,U,k)
# print(cov.shape)
# print(U.shape)
# print(z)
X_reproduces = reproduces(z,U,k)

绘制出最开始数据集的散点图和压缩重现后的散点图

fig,ax = plt.subplots()
ax.scatter(X_standardization[:,0],X_standardization[:,1],c="b")
ax.scatter(X_reproduces[:,0],X_reproduces[:,1],c="r")
plt.show()

如果想要展示出,相对应的点,可以加上下面的代码


# for i in range(len(X_standardization)):
#     plt.plot([X_standardization[i,0],X_reproduces[i,0]],[X_standardization[i,1],X_reproduces[i,1]],"k--")

faces

读取数据

#读取数据
path_faces = "ex7faces.mat"
data_faces = sio.loadmat(path_faces)
# print(data_faces.keys())
X_faces = data_faces.get("X")
# print(X.shape)

可视化

这里我定义了两个函数,分别用来选择其中一个样本进行绘制和选择100个样本。

#可视化
def one_image(X_faces):pick_one = np.random.randint(0,len(X))image = X_faces[pick_one,:]image = image.reshape(32,32)fig,ax = plt.subplots()ax.imshow(image.T,cmap="Greys_r")plt.xticks([])plt.yticks([])plt.show()# one_image(X_faces)
def more_image(X_faces):pick_more = np.random.randint(0,len(X),100)images = X_faces[pick_more,:]fig,ax = plt.subplots(nrows=10,ncols=10, figsize=(8, 8), sharex=True, sharey=True)for i in range(10):for j in range(10):ax[i,j].imshow(images[10*i+j].reshape(32,32).T,cmap="Greys_r")plt.xticks([])plt.yticks([])plt.show()# more_image(X_faces)

主成分数量k的选择

PCA所做的就是试图寻找一个投影平面对数据进行投影,使每个点到它们对应的支线上的投影点(投影误差)最小化。

投影的平均均方误差:\frac{1}{m}\sum_{i=1}^{m}\left \| x^{(i)}-x_{approx}^{(i)} \right \|^{2}

训练集的方差:\frac{1}{m}\sum_{i=1}^{m}\left \| x^{(i)} \right \|^{2}

我们希望找到最小的k使得\frac{\frac{1}{m}\sum_{i=1}^{m}\left \| x^{(i)}-x_{approx}^{(i)} \right \|^{2}}{\frac{1}{m}\sum_{i=1}^{m}\left \| x^{(i)} \right \|^{2}}(平均均方误差与训练集方差的比例)是一个很小的值。如果我们希望这个比例小于等于1%,也就是说我们保留了99%的方差。

#确定k值
def get_k(X_faces,S):for k in range(X_faces.shape[1]):error = 1 - np.sum(S[:k])/np.sum(S)if error <=0.01:return kelse:k = k + 1

调用函数

展示降维前和降维后的图片

X_faces_standardization = standardization(X_faces)
cov_faces = covariance_matrix(X_faces_standardization)
U_faces,S_faces,V_faces = eigenvector(cov_faces)
k_faces = get_k(X_faces,S_faces)
z_faces = get_z(X_faces_standardization,U_faces,k_faces)
X_reproduces = reproduces(z_faces,U_faces,k_faces)
more_image(X_reproduces),more_image(X_faces)
print(k_faces)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『C++实战项目 负载均衡式在线OJ』一、项目介绍与效果展示(持续更新)

文章目录 一、项目介绍二、开发环境三、第三方库四、相关技术五、项目整体框架代码目录框架 代码仓库连接 点击这里✈ 一、项目介绍 本项目是实现一个仿 leetcode 的 OJ (Online-Judge&#xff09;系统。更准确的说应该称之为leetcode 的裁剪版。因为本项目只实现了leetcode中…

《计算机网络》(第8版)第9章 无线网络和移动网络 复习笔记

第 9 章 无线网络和移动网络 一、无线局域网 WLAN 1 无线局域网的组成 无线局域网提供移动接入的功能&#xff0c;可分为两大类&#xff1a;有固定基础设施的和无固定基础设 施的。 &#xff08;1&#xff09;IEEE 802.11 IEEE 802.11 是无线以太网的标准&#xff0c;是有固定…

【保姆级系列:锐捷模拟器的下载安装使用全套教程】

保姆级系列&#xff1a;锐捷模拟器的下载安装使用全套教程 1.介绍2.下载3.安装4.实践教程5.验证 1.介绍 锐捷目前可以通过EVE-NG来模拟自己家的路由器&#xff0c;交换机&#xff0c;防火墙。实现方式是把自己家的镜像导入到EVE-ng里面来运行。下面主要就是介绍如何下载镜像和…

【初阶数据结构题目】10. 链表的回文结构

链表的回文结构 点击链接做题 思路1&#xff1a;创建新的数组&#xff0c;遍历原链表&#xff0c;遍历原链表&#xff0c;将链表节点中的值放入数组中&#xff0c;在数组中判断是否为回文结构。 例如&#xff1a; 排序前&#xff1a;1->2->2->1 设置数组来存储链表&a…

1、爬⾍概述

1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Crawler&#xff09;是一种通过编写程序自动访问并提取互联网上数据的技术。爬虫可以帮助我们在浏览网页时自动收集和保存一些有用的数据&#xff0c;例如图片、视频和文本信息。简单来说&#xff0c;爬虫就是自动化的浏览器。…

react-native从入门到实战系列教程-React Native Elements

react-native的ui框架内网真的是屈指可数&#xff0c;能用的成熟的几乎找不到。不像web端的繁荣景象&#xff0c;可以用荒凉来形容不为过。 京东的nutui说也支持react-native,官网及其简陋。尝试了未成功运行&#xff0c;可能是项目类型不同&#xff0c;对比其他类型的ui库都分…

Flink中上游DataStream到下游DataStream的内置分区策略及自定义分区策略

目录 全局分区器GlobalPartitioner 广播分区器BroadcastPartitioner 哈希分区器BinaryHashPartitioner 轮询分区器RebalancePartitioner 重缩放分区器RescalePartitioner 随机分区器ShufflePartitioner 转发分区器ForwardPartitioner 键组分区器KeyGroupStreamPartitio…

【java基础】徒手写Hello, World!程序

文章目录 前提&#xff1a;java环境变量配置使用vscode编写helloworld解析 前提&#xff1a;java环境变量配置 https://blog.csdn.net/xzzteach/article/details/140869188 使用vscode编写helloworld code .为什么用code看下图 报错了&#xff01;&#xff01;&#xff01;&…

样式与特效(3)——实现一个测算页面

这次我们使用前端实现一个简单的游戏页面,理论上可以增加很多玩法&#xff0c;&#xff0c;但是这里为了加深前端的样式和JS点击事件&#xff0c;用该案例做练习。 首先需要掌握手机端的自适应&#xff0c;我们是只做手机端玩家页面 。需要允许自适应手机端页面&#xff0c; 用…

24年电赛——自动行驶小车(H题)MSPM0G3507-编码电机驱动与通用PID

一、编码电机驱动 编码电机的详情可以查看此篇文章&#xff1a; stm32平衡小车--&#xff08;1&#xff09;JGB-520减速电机tb6612&#xff08;附测试代码&#xff09;_jgb520-CSDN博客 简单来说&#xff0c;编码电机的驱动主要是给一个 PWM 和一个正负级就能驱动。PWM 的大小…

9-springCloud集成nacos config

本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module&#xff0c;这两个module分别是两个springboot项目&#xff0c;都从nacos中获取连接mysql的连接参数。我们开工。 …

羌活基因组--文献精读-36

The chromosome-scale assembly of the Notopterygium incisum genome provides insight into the structural diversity of coumarins 羌活&#xff08;Notopterygium incisum&#xff09;基因组的染色体级别组装为香豆素的结构多样性提供了新的见解 摘要 香豆素是由苯丙素途…

学生信息管理系统(Python+PySimpleGUI+MySQL)

吐槽一下 经过一段时间学习pymysql的经历&#xff0c;我深刻的体会到了pymysql的不靠谱之处&#xff1b; 就是在使用int型传参&#xff0c;我写的sql语句中格式化%d了之后&#xff0c;我在要传入的数据传递的每一步的去强制转换了&#xff0c;但是他还是会报错&#xff0c;说我…

决策树可解释性分析

决策树可解释性分析 决策树是一种广泛使用的机器学习算法&#xff0c;以其直观的结构和可解释性而闻名。在许多应用场景中&#xff0c;尤其是金融、医疗等领域&#xff0c;模型的可解释性至关重要。本文将从决策路径、节点信息、特征重要性等多个方面分析决策树的可解释性&…

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布&#xff08;Canary Release&#xff09; 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级&#xff0c;旧版本保留一定时间便于回滚优点&#xff1a;用户无感知&#xff0c;部署和回滚速度较…

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…

chrome/edge浏览器插件开发入门与加载使用

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、插件与普通前端项目二、开发插件——manifest.json三、插件使用edge浏览器中使用/加载插件chrome浏览器中使用/加载插件 总结 前言 chrome插件的出现&#xff0c;初衷可能是为了方便用户更好地控制浏览器&#xff0c…

C++ | 类和对象(下)(static成员、友元、内部类、匿名对象)

目录 ​编辑 static成员 static性质简介 static属于整个类&#xff0c;属于所有对象 static成员的声明与定义 static函数 友元friend 友元特性简介 友元关系讲解 内部类 特性一 特性二 匿名对象 结语 static成员 static性质简介 static成员在类里面是非常独特的…

Golang之OpenGL(一)

使用OpenGL实现窗口中绘制三角形&#xff08;纯色|彩色&#xff09;、正方形&#xff08;变色&#xff09; 一、简单实现窗口绘制三角形二、绘制的多颜色三角形&#xff08;基于 ‘ 简单实现窗口绘制三角形 ’ &#xff09;1、在顶点着色器和片段着色器中添加了颜色的输入和输出…

反制攻击者-蚁剑低版本

目录 安装 攻击者获取防守方的权限 防守方反制攻击者 防守方获取攻击者的shell权限 安装 安装蚁剑2.0.7版本 链接&#xff1a;https://pan.baidu.com/s/1t40UxkZ2XuSWG6VCdGzvDw?pwd8888 提取码&#xff1a;8888 下载好后先打开Loader文件夹下的.exe文件&#xff0c;打…