第二周周报

news2024/11/15 12:52:38

PCA

PCA 是一种流行的统计技术,用于识别数据集中最重要的特征或模式并将其转换为较低维的表示形式。本报告将涵盖PCA的基本原理、其优点。

步骤

主成分分析是一种数学技术,可降低数据集的维数,同时保留尽可能多的信息。它通过查找主成分来实现这一点,主成分是表示数据中最大方差方向的正交向量。

  • 数据标准化:PCA 通常从数据标准化开始,以确保所有变量具有相似的尺度。此步骤涉及减去每个变量的平均值并除以其标准差
  • 协方差矩阵计算:下一步是计算标准化数据的协方差矩阵。协方差矩阵提供有关数据集中变量对之间的关​​系和方差的信息。
    协方差矩阵衡量数据集中变量对之间的关​​系和方差。计算公式:
    C o v ( X ) = 1 n ⋅ ( X − μ ) ⋅ ( X − μ ) T Cov(\mathbf{X})=\frac{1}{n} \cdot \mathbf{(X-\mu) }\cdot \mathbf{(X-\mu)}^\mathsf{T} Cov(X)=n1(Xμ)(Xμ)T。这里 C o v ( X ) Cov(\mathbf{X}) Cov(X)是协方差矩阵, μ \mu μ是平均向量, n n n X 的行数 \mathbf{X}的行数 X的行数
    协方差矩阵求出来是 m ∗ m m*m mm的矩阵 m m m是特征数量。对角线的值是方差(自身的协方差),非对角线上的是协方差,用协方差来表示两个特征之间相关性。协方差大于0,意味着两个特征正相关,小于0负相关,等于0无关。
  • 特征分解:然后对协方差矩阵进行特征分解,产生矩阵的特征值和特征向量。特征向量表示主成分,相应的特征值表示每个成分解释的方差量。
    求协方差矩阵的特征值和特征向量: { ( λ 1 , μ 1 ) , ( λ 2 , μ 2 ) ⋯ ( λ m , μ m ) } \{{(\lambda _{1},\mu _1),(\lambda _{2},\mu _2)}\cdots(\lambda _{m},\mu _m)\} {(λ1,μ1),(λ2,μ2)(λm,μm)}
  • 成分选择和投影:主成分根据其相应的特征值进行排序,最高特征值表示解释数据中最大方差的成分。选择所需数量的主成分,并将数据投影到这些成分上以获得较低维的表示。
    我们认为特征值越大,代表越多的信息,所以取几个比较大的特征值抛弃剩下的就是降维后的 X \mathbf{X} X
import numpy as np
from sklearn.decomposition import PCA

# Create a sample dataset
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

# Initialize PCA with the desired number of components
n_components = 2
pca = PCA(n_components=n_components)

# Fit the data to PCA
pca.fit(X)

# Access the principal components
principal_components = pca.components_

# Transform the data to the lower-dimensional representation
X_transformed = pca.transform(X)

# Access the explained variance ratio
explained_variance_ratio = pca.explained_variance_ratio_

# Print the results
print("Principal Components:")
print(principal_components)
print("\nTransformed Data:")
print(X_transformed)
print("\nExplained Variance Ratio:")
print(explained_variance_ratio)

sklearn库里面有PCA的包,使用的时候可以直接调用,n_components是需要保留的主成分数量,使用方法 fit() 将数据拟合X到 PCA ,使用components属性访问主成分,使用方法 transform() 访问转换后的数据。

在这里插入图片描述

CNN基本代码

继上周学习CNN后,这周开始体验一下CNN的一些Demo。找数据集真的难受,找不到合适的,最后还是用教学数据集MNIST吧。这个数据集的好处就是是gz文件,不用进行数据预处理,很规范。


import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import cv2

导包


torch.manual_seed(1)  # 使用随机化种子使神经网络的初始化每次都相同

# 超参数
EPOCH = 1  # 训练整批数据的次数
BATCH_SIZE = 50
LR = 0.001  # 学习率
DOWNLOAD_MNIST = True  # 表示还没有下载数据集,如果数据集下载好了就写False

# 下载mnist手写数据集
train_data = torchvision.datasets.MNIST(
    root='./data/',  # 保存或提取的位置  会放在当前文件夹中
    train=True,  # true说明是用于训练的数据,false说明是用于测试的数据
    transform=torchvision.transforms.ToTensor(),  # 转换PIL.Image or numpy.ndarray

    download=DOWNLOAD_MNIST,  # 已经下载了就不需要下载了
)

test_data = torchvision.datasets.MNIST(
    root='./data/',
    train=False  # 表明是测试集
)

# 批训练 50个samples, 1  channel,28x28 (50,1,28,28)
# Torch中的DataLoader是用来包装数据的工具,它能帮我们有效迭代数据,这样就可以进行批训练
train_loader = Data.DataLoader(
    dataset=train_data,
    batch_size=BATCH_SIZE,
    shuffle=True  # 是否打乱数据,一般都打乱
)

# 进行测试
# 为节约时间,测试时只测试前2000个
#
test_x = torch.unsqueeze(test_data.train_data, dim=1).type(torch.FloatTensor)[:2000] / 255
# torch.unsqueeze(a) 是用来对数据维度进行扩充,这样shape就从(2000,28,28)->(2000,1,28,28)
# 图像的pixel本来是0到255之间,除以255对图像进行归一化使取值范围在(0,1)
test_y = test_data.test_labels[:2000]

class CNN(nn.Module):  # 我们建立的CNN继承nn.Module这个模块
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(
            # 第一个卷积con2d
            nn.Conv2d(  # 输入图像大小(1,28,28)
                in_channels=1,  # 输入图片的高度,因为minist数据集是灰度图像只有一个通道
                out_channels=16,  # n_filters 卷积核的高度
                kernel_size=5,  # filter size 卷积核的大小 也就是长x宽=5x5
                stride=1,  # 步长
                padding=2,  # 想要con2d输出的图片长宽不变,就进行补零操作 padding = (kernel_size-1)/2
            ),  # 输出图像大小(16,28,28)
            # 激活函数
            nn.ReLU(),
            # 池化,下采样
            nn.MaxPool2d(kernel_size=2),  # 在2x2空间下采样
            # 输出图像大小(16,14,14)
        )
        # 建立第二个卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)
        self.conv2 = nn.Sequential(
            # 输入图像大小(16,14,14)
            nn.Conv2d(  # 也可以直接简化写成nn.Conv2d(16,32,5,1,2)
                in_channels=16,
                out_channels=32,
                kernel_size=5,
                stride=1,
                padding=2
            ),
            # 输出图像大小 (32,14,14)
            nn.ReLU(),
            nn.MaxPool2d(2),
            # 输出图像大小(32,7,7)
        )
        # 建立全卷积连接层
        self.out = nn.Linear(32 * 7 * 7, 10)  # 输出是10个类

    # 下面定义x的传播路线
    def forward(self, x):
        x = self.conv1(x)  # x先通过conv1
        x = self.conv2(x)  # 再通过conv2
        # 把每一个批次的每一个输入都拉成一个维度,即(batch_size,32*7*7)
        # 因为pytorch里特征的形式是[bs,channel,h,w],所以x.size(0)就是batchsize
        x = x.view(x.size(0), -1)  # view就是把x弄成batchsize行个tensor
        output = self.out(x)
        return output


cnn = CNN()
print(cnn)
optimizer = torch.optim.Adam(cnn.parameters(), lr=LR)
# 损失函数
loss_func = nn.CrossEntropyLoss()  # 目标标签是one-hotted

# 开始训练
for epoch in range(EPOCH):
    for step, (b_x, b_y) in enumerate(train_loader):  # 分配batch data
        output = cnn(b_x)  # 先将数据放到cnn中计算output
        loss = loss_func(output, b_y)  # 输出和真实标签的loss,二者位置不可颠倒
        optimizer.zero_grad()  # 清除之前学到的梯度的参数
        loss.backward()  # 反向传播,计算梯度
        optimizer.step()  # 应用梯度

        if step % 50 == 0:
            test_output = cnn(test_x)
            pred_y = torch.max(test_output, 1)[1].data.numpy()
            accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0))
            print('Epoch: ', epoch, '| train loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % accuracy)

torch.save(cnn.state_dict(), 'cnn2.pkl')#保存模型
# 加载模型
cnn.load_state_dict(torch.load('cnn2.pkl'))
# 火力全开
cnn.eval()
# print 10 predictions from test data
inputs = test_x[:32]  # 测试32个数据
test_output = cnn(inputs)
pred_y = torch.max(test_output, 1)[1].data.numpy()
print(pred_y, 'prediction number')  # 打印识别后的数字
# print(test_y[:10].numpy(), 'real number')

img = torchvision.utils.make_grid(inputs)
img = img.numpy().transpose(1, 2, 0)
cv2.imshow('win', img)  # opencv显示需要识别的数据图片
key_pressed = cv2.waitKey(0)

在这里插入图片描述
这个数据集是灰度图,只有一个通道,彩色图有3个通道。图像这块个人感觉最恶心就是维度。
个人经验: [ 2000 ∗ 1 ∗ 28 ∗ 28 ] [2000*1*28*28] [200012828],读这个数据要倒着看,2828是基本的数据单位,1是指由多少个 28 ∗ 28 28*28 2828构成一条数据,2000,就是有2000个128*28。如果是 [ 2000 ∗ 3 ∗ 28 ∗ 28 ] [2000*3*28*28] [200032828],这个数据集理论上是3倍的 [ 2000 ∗ 1 ∗ 28 ∗ 28 ] [2000*1*28*28] [200012828]大小,表示用3个 28 ∗ 28 28*28 2828表示一条数据。

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

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

相关文章

Redis集群(Cluster和Codis)

1.为什么使用集群? 当我们遇到一个大数据量存储情况时,有两种解决方案: 纵向扩容:升级单个redis实例的配置,包括增加内存容量、磁盘容量,以及使用更高的cpu配置。 纵向扩容:简单直接。也存在一些…

98英寸带来加倍沉浸享受,三星Q80Z新品呈现大有不同的精彩

作者 | 曾响铃 文 | 响铃说 在过去几年,家电行业可以说是负重前行。在经历2022年整年寒冬后,2023年的彩电市场能否迎来一场翻身仗?这是年初被业内讨论最多的话题。 目前2023年已经过半,据奥维云网数据显示,2023年一…

InsCode Stable Diffusion 美图活动一期——即刻体验!来自 CSDN 的 SD 模型

文章目录 🔥关于活动📋前言🎯什么是 Stable Diffusion🧩Stable Diffusion 与其他 AI 艺术生成器有什么区别? 🎯开始体验 InsCode Stable Diffusion🎯试用 SD 模型生成优质人物好图🧩…

内存池是什么原理?|内存池简易模拟实现|为学习高并发内存池tcmalloc做准备

前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…

在Linux系统中如何搭建Apache服务

在Linux系统中如何搭建Apache服务 Apache服务是一种开源的、跨平台的Web服务器软件,它的作用是提供网页内容给用户的Web浏览器。具体来说,Apache服务有以下几个主要的作用: 1.Web服务器:Apache是一款功能强大且广泛使用的Web服务…

54、Mysql索引的数据结构,各自优劣

Mysql索引的数据结构,各自优劣 索引的数据结构和具体存储引擎的实现有关在MySQL中使用较多的索引有Hash索引,B树索引等InnoDB存储引擎的默认索引实现为: B树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求…

C++编程(三)—— C++11

文章目录 绑定器和函数对象函数对象绑定器lambda表达式 关键词与语法autonullptr右值引用 智能指针容器set和mapunordered_set和unordered_map数组链表 语言级别支持的多线程编程thread子线程如何结束主线程如何处理子线程线程间的互斥线程的同步通信机制(条件变量&…

Windows Cluster 分布式算法

在分布式系统中,都需要解决分布式一致性问题。那么,在Windows 集群中,使用了什么算法来保证集群的一致性呢——Paxos。Windows Server 故障转移集群 (WSFC) 使用 Paxos 算法在整个系统中同步更改。通过记录 Paxos Tag 值并保留历史记录&#…

连锁门店如何搭建B2B2C多用户商城系统?

现在很多的线下店铺都开始慢慢的转型线上了,想线上线下相结合,但是最近很多的商家都在问什么样的B2B2C商城系统开发适合线下店铺呢?这个问题今天加速度jsudo小编给大家一起整理如下,相信商家看完后就知道如何选择一款合适的商城系统了。 一、…

【C语言】求序列前N项和

问题描述 输入一个正整数n&#xff0c;输出2/13/25/38/5…的前n项之和&#xff08;该序列从第2项起&#xff0c;每一项的分子是前一项分子与分母的和&#xff0c;分母是前一项的分子&#xff09;&#xff0c;保留2位小数。试编写相应程序。 代码实现 #include<stdio.h>…

spring-14优化性能

原始Junit测试Spring的问题 这里的&#xff1a;第一行代码获得应用上下文对象&#xff0c;第二行代码获得你那个对象 2、原先测试找junit&#xff0c;现在测试找spring&#xff0c;然后再找&#xff0c;junit&#xff0c;告诉我配置文件是什么&#xff0c;然后注入测试对象&am…

LeetCode 172.阶乘后的零

基础方法就是暴力解&#xff0c;其次是数学归纳。 具体思路如下&#xff1a;&#xff08;copy大佬的&#xff09; 耐心看完&#xff01; 代码如下&#xff1a; #include <iostream> #include <vector> #include <cmath> #include <algorithm> #incl…

Android GridPager实战,从RecyclerView to ViewPager

这个简单的的案例展示了如何从RecyclerView to ViewPager&#xff0c;以网上的公开图片为样例。 安卓开发中从RecyclerView 到 ViewPager demo运行结果demo项目工程目录结构关键代码 MainActivity关键代码GridFragment关键代码ImageFragment关键代码ImagePagerFragment关键布局…

关于示波器引入50HZ工频干扰的解释

前几天&#xff0c;小白在实验室工作时&#xff0c;听到同事抱怨示波器有问题。上前查看&#xff0c;才知道&#xff0c;小白的那位同事在测量信号波形时&#xff0c;实际与理想相差甚远。于是乎&#xff0c;在探头什么也不接的情况下&#xff0c;发现示波器本身也存在波形信号…

2022Robocom国赛-u2 女王的大敕令

副本是游戏里的一个特色玩法&#xff0c;主要为玩家带来装备、道具、游戏资源的产出&#xff0c;满足玩家的游戏进程。 在 MMORPG《最终幻想14》里&#xff0c;有一个攻略人数最大达到 48 人的副本“零式贡希尔德神庙”&#xff0c;其中守关 BOSS “天佑女王”有一个很有趣的技…

图形编辑器开发:一些会用到的简单几何算法

大家好&#xff0c;我是前端西瓜哥。 开发图形编辑器&#xff0c;你会经常要解决一些算法问题。本文盘点一些我开发图形编辑器时遇到的简单几何算法问题。 矩形碰撞检测 判断两个矩形是否发生碰撞&#xff08;或者说相交&#xff09;&#xff0c;即两个矩形有重合的区域。 …

C生万物 | 程序员必备实用调试技巧分享

一起来学习调试~ 一、前言二、什么是Bug&#xff1f;三、调试是什么&#xff1f;有多重要&#xff1f;1、导学引入2、调试的基本步骤3、Debug和Release的介绍 四、Windows环境下VS调试介绍1、调试环境的准备2、学会快捷键3、调试的时候查看程序当前信息3.1 查看临时变量的值3.2…

基于SSM的购物商城系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏

场景 SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文&#xff0c;查询明文&#xff1a; SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文&#xff0c;查询明文_霸道流氓气质的博客-CSDN博客 上面讲的是数据库中存储密文&#xff0…

音乐格式转换mp3软件有哪些?分享三个方法给大家!

要将音乐文件转换为MP3格式的情况&#xff0c;以便在各种设备上播放。为了帮助大家完成这个任务&#xff0c;下面将分享三种实用的方法和工具&#xff0c;其中方法一是使用记灵在线工具进行音乐格式转换。无论您是音乐爱好者还是需要将音频文件转换为MP3格式的专业人士&#xf…