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

news2024/9/24 15:17:35

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)/m
    return 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_reduce
    return z

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

#压缩重现
def reproduces(z,U,k):
    U_reduce = U[:, :k]
    X_reproduces = z @ U_reduce.T
    return 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 k
        else:
            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.coloradmin.cn/o/1976158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python数据分析案例58——热门游戏数据分析及其可视化

案例背景 有哪个男生不喜欢玩游戏呢&#xff1f;就算上了班儿也要研究一下游戏以及热门的游戏。正好这里有个热门的游戏数据集&#xff0c;全球热门游戏数据集来做一下一些可视化的分析。 数据介绍 该文件包含一个数据集&#xff0c;详细说明了多个平台上的各种流行游戏。每个…

【Golang 面试 - 进阶题】每日 3 题(十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Cesium 高德地图暗黑化

Cesium 高德地图暗黑化 高德电子地图实现暗黑效果 // 设置图层滤镜new ImageryLayerFilter({viewer: viewer,imageryLayer: imageryLayer,});

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构和使用方式)

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构) 本文介绍论文原理介绍网络代码多种yaml设置网络测试及实验结果<!-- 这里放入论文图片 --> &emsp;;本文介绍 本文给大家带来的改进机制是结合MobileNetV4骨干网络,其中来自2024.5月发布的MobileNetV4…

Pageadmin 漏洞教程

上传文件解压拿webshell 用哥斯拉&#xff0c;生成一个asp木马 这个就是我们生成的asp木马 不能直接上传 压缩为zip文件 上传 上传以后我们点击解压 就成功了 然后我们去访问 然后用哥斯拉访问 然后再点击添加 这样就成功了 成功进入

VSCode在windows系统下的配置简单版

参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便&#xff01;&#xff01;&#xff01; 运行c代…

点击clean失败的操作Error running ‘demo4 [clean]‘ No valid Maven installation found.

错误情况&#xff1a; 解决方法&#xff1a; 重新调整自己的maven&#xff1a; 点击settings&#xff0c;搜索maven&#xff0c;点击进入&#xff1a; 选择自己的真实路径&#xff1a; 效果: 可以发现&#xff0c;运行clean成功&#xff01;

Useless Fan

灵感来源于老外的一个作品&#xff0c;但是只有风扇功能&#xff0c;除了袖珍感觉没啥用。 在淘宝上十几块买了一堆原件&#xff0c;于是手痒&#xff0c;自己手搓了一个&#xff0c;设计了个简单的3D打印外壳。 包括3大功能&#xff1a;风扇&#xff0c;充电宝&#xff08;2…

Spring MVC 快速入门指南及实战演示

1、SpringMVC简介 1.1 背景 Servlet属于web层开发技术&#xff0c;技术特点&#xff1a; 1. 每个请求都需要创建一个Servlet进行处理 2. 创建Servlet存在重复操作 3. 代码灵活性低&#xff0c;开发效率低 是否有技术方案可以解决以上问题&#xff1f; 1.2 SpringMVC概述 Sp…

C#加班统计次数

C#加班统计次数 运行环境&#xff1a;vs2022 .net 8.0 社区版 1、用C#语言&#xff1b;2、有界面上传Excel文件; 3、对Excel列&#xff08;部门、人员姓名、人员编号、考勤时间 &#xff09;处理&#xff1a;&#xff08;1&#xff09;按人员编号、考勤日期分组且保留原来字段&…

矩阵快速幂优化dp

之前一直想找一个矩阵快速幂的专题&#xff0c;但是都没有题目来总结&#xff0c;今天就来水一下 这个题目的转移方程我们可以很快想出来&#xff0c;但是我们如何作为我们矩阵快速幂的敲门砖呢&#xff1f; 有一个问题要注意的是我们由于这题不是取模的&#xff0c;可能会溢出…

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…

QuanTide-weekly第1期

本周Po文 这周我们共发表5篇文章。《基于 XGBoost 的组合策略…》等两篇详细讲解了机器学习构建组合策略的框架和常见问题。 文章要点与结论&#xff1a; 通过两阶段式方案实现多因子、多资产的组合策略构建。第一阶段基于XGBoost构建多个多因子单标的模型&#xff0c;第二阶…

安卓基本布局(下)

TableLayout 常用属性描述collapseColumns设置需要被隐藏的列的列号。shrinkColumns设置允许被伸缩的列的列号。stretchColumns设置允许被拉伸的列的列号。 <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/TableL…

yolov3 neck部分搭建,以及完整的网络搭建代码,可直接运行

目录 1. 用来实现共同的一些操作 common_module.py 2.1 使用到的通道配置 net_config.py 2.2 主干网络 darknet53.py 3. predict部分 neck.py 4. 拼凑成完整的yolov3网络 Yolov3.py 5. 网络结构如下 上次提到了搭建了主干网络&#xff0c;这个加上neck就可以构建…

内网穿透--meterpreter端口转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部主机&#xff0c;则需要通过已连接会话&#xff0c;代理穿透访问内网主机服务。 实验设备 1.路由器一台 2.内网 Win 7一台 3.公网 Kali 一台 4.网络 …

LeetCode面试150——238除自身以外数组的乘积

题目难度&#xff1a;中等 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 左右乘积列表 参考文献 1 题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 an…

第十二节、人物下蹲

一、SuB-State Machine(子状态机) 1、创建一个子状态 2、可以选择退出的动画 二、人物下蹲 1、人物动画下蹲 2、人物碰撞体下蹲

日志远程同步实验

目录 一.实验环境 二.实验配置 1.node1发送方配置 &#xff08;1&#xff09;node1写udp协议 &#xff08;2&#xff09;重启服务并清空日志 2.node2接收方配置 &#xff08;1&#xff09;node2打开接受日志的插件&#xff0c;指定插件用的端口 &#xff08;2&#xff…

C#和S7-1200PLC S7.NET通信

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。_s7协议批量…