当前位置: 首页 > article >正文

深度学习——数据预处理,张量降维

目录

  • 一、数据预处理
    • 1.1 读取数据集
    • 1.2 处理缺失值
    • 1.3 转换为张量类型
  • 二、张量
    • 2.1 张量算法的基本性质
      • 2.1.1 两个形状相同的张量相加
      • 2.1.2 哈达玛积
      • 2.1.3 与标量相加或相乘
    • 2.2 降维
      • 2.2.1 对所有行的元素求和来降维(轴0)
      • 2.2.2 对所有列的元素求和来降维(轴1)
      • 2.2.3 对所有元素求和
      • 2.2.4 平均值
    • 2.3 非降维求和:保持轴数不变
    • 2.4 点积
  • 三、范数

一、数据预处理

1.1 读取数据集

  将数据集按行写入csv文件中。要从创建的csv文件中加载原始数据集,导入pandas包并调用read_csv函数。

import os
os.makedirs(os.path.join('..','data'),exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file,'w') as f:
    f.write('NumRooms, Alley, Price \n')  #列名
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')

在这里插入图片描述

1.2 处理缺失值

  NaN项代表缺失值。处理缺失值的数据的典型方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
  通过位置索引iloc将data分成inputs和outputs,其中前者为data的前两列,而后者为data的最后一列。对于inputs中的缺失值,可以用同一列的均值替换NaN项。

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

  出现如下报错的原因:原因是第2列识别为str,无法进行数值平均运算,需要在括号加入限制条件,仅在数据类型为数值的列进行平均值插值。
在这里插入图片描述
在这里插入图片描述

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean(numeric_only = True))
print(inputs)

在这里插入图片描述

data.iloc[ ]是python中pandas库的一个非常有用的功能函数,它允许通过行和列的整数位置索引来选择数据。
data.iloc[:, 0:2] 代表选择第1,2列的所有行
data.iloc[:, 2] 代表选择第3列的所有行

  对于inputs中的类别值或离散值,我们将NaN视为一个类别。由于Alley列只接受两种类型的类别值Pave和NaN,pandas可以自动将此列转换为两列Alley_pave和Alley_nan。Alley列为pave的行为将Alley_pave的值设置为1,Alley_nan的值设置为0;缺失Alley列的会将Alley_pave和Alley_nan分别设置为0和1.

inputs = pd.get_dummies(inputs, dummy_na=True, dtype = int)
print(inputs)

在这里插入图片描述

pd.get_dummies( )是pandas库中用于独热编码(One-Hot Encoding)的函数。它的作用是将分类(离散)变量的每个不同取值都拓展为一个新的二进制编码(0或1),从而方便机器学习模型处理。
dtype可以指定输出的类型,默认情况下,输出的是布尔值(True或False),改为int类型,输出的是0或1

1.3 转换为张量类型

  输入的inputs和outputs中的所有元素都是数值类型,它们可以转换为张量格式。

import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

在这里插入图片描述

二、张量

2.1 张量算法的基本性质

2.1.1 两个形状相同的张量相加

A = torch.arange(20, dtype=torch.float32).reshape(5,4)
B = A.clone() #通过分配新内存,将A的一个副本分配给B
A , A+B

在这里插入图片描述

2.1.2 哈达玛积

  两个矩阵的按元素乘法称为哈达玛积,数学符号为 ⨀ \bigodot

A*B

在这里插入图片描述

2.1.3 与标量相加或相乘

  将张量加上或乘以一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

a = 2
x=torch.arange(24).reshape(2,3,4)
a+x, (a*x).shape

在这里插入图片描述

2.2 降维

A = torch.arange(20).reshape(5,4)
A

在这里插入图片描述
  默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。可以指定张量沿哪一个轴来通过求和降低维度。

2.2.1 对所有行的元素求和来降维(轴0)

  可以在调用函数时,指定axis=0,由于输入矩阵沿轴0降维以生产输出向量,此输入轴0的维度在输出形状中消失。

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0 , A_sum_axis0 .shape

在这里插入图片描述

2.2.2 对所有列的元素求和来降维(轴1)

A_sum_axis1 = A.sum(axis=1)
A_sum_axis1 , A_sum_axis1 .shape

在这里插入图片描述

2.2.3 对所有元素求和

  沿着行和列对矩阵求和,等价于对矩阵的所有元素求和。

A.sum(axis=[0,1])

在这里插入图片描述

2.2.4 平均值

两种方法 = { 1 、总和除以元素总数来计算平均值 2 、通过调用函数来计算任意形状张量的平均值 两种方法=\begin{cases} 1、总和除以元素总数来计算平均值\\2、通过调用函数来计算任意形状张量的平均值\end{cases} 两种方法={1、总和除以元素总数来计算平均值2、通过调用函数来计算任意形状张量的平均值

A = torch.arange(20, dtype=torch.float32).reshape(5,4)
A
A.mean(), A.sum()/A.numel()

在这里插入图片描述

2.3 非降维求和:保持轴数不变

A = torch.arange(20, dtype=torch.float32).reshape(5,4)
print(A)
sum_A = A.sum(axis=1, keepdims = True)
sum_A

在这里插入图片描述

keepdims为True,表示求和前后shape不变,一般情况下,keepdims为False

  由于sum_A在对每行进行求和后,仍保持两个轴,可以通过广播将A除以sum_A

A / sum_A

在这里插入图片描述
  如果想要沿某个轴计算A的元素的累积总和,可以调用cumsum函数,此函数不会沿任何轴降低输入张量的维度。

A.cumsum(axis=0)

在这里插入图片描述

2.4 点积

  相同位置的按元素乘积的和

x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y ,torch.dot(x, y)

在这里插入图片描述

三、范数

  L2范数是向量元素平方和的平方根
∥ x ∥ 2 = ∑ i = 1 n x i 2 \Vert \bm x \Vert_2=\sqrt{\sum_{i=1}^n x_i^2} x2=i=1nxi2

u = torch.tensor([3.0, -4.0])
torch.norm(u)

在这里插入图片描述
  L1范数表示为向量元素的绝对值之和
∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \Vert \bm x \Vert_1=\sum_{i=1}^n \vert x_i \vert x1=i=1nxi
  与L2范数相比,L1范数受到异常值的影响较小,为了计算L1范数,将绝对值函数和按元素求和函数组合起来。

torch.abs(u).sum()

在这里插入图片描述


http://www.kler.cn/a/304591.html

相关文章:

  • Webkit 滚动条样式属性
  • 机器学习【激活函数】
  • C++算法练习-day40——617.合并二叉树
  • 分布式锁实践方案
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • Qt 边框border - qss样式
  • C++类与对象深度解析(一):从抽象到实践的全面入门指南
  • Linux相关:在阿里云下载centos系统镜像
  • Leetcode Hot 100刷题记录 -Day16(旋转图像)
  • 15.2 定义一个prometheus数据存储使用的pv
  • A Single Generic Prompt forSegmenting Camouflaged Objects
  • java: 程序包org.junit.jupiter.api不存在
  • 数据分析-前期数据处理
  • MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法
  • Prompt提示词技巧
  • OA项目值用户登入首页展示
  • ArrayList、LinkedList和Vector的区别
  • Python 的分支结构
  • 如何选择适合企业的高效财税自动化软件
  • 桌面应用框架:tauri是后起之秀,赶上electron路还很长。
  • Mysql | 知识 | 理解是怎么加锁的
  • ansible企业实战
  • 高级java每日一道面试题-2024年9月09日-数据库篇-事务提交后数据仍然没有持久化,可能的原因是什么?
  • 海外服务器:开启全球业务的关键钥匙
  • 神经网络的公式推导与代码实现(论文复现)