动手学机器学习——数据预处理&线性代数

动手学机器学习

    • 1.监督学习
    • 2.无监督学习
    • 3.强化学习
    • 4.入门知识
    • 5.数据预处理
    • 6.线性代数
      • 5.1非降维求和
      • 6.2点积
    • 6.3矩阵乘法
    • 6.3 范数

1.监督学习

  • 判断回归问题的一个很好的经验法则是,任何有关“多少”的问题很可能就是回归问题
    在这些情况下,我们将尝试学习最小化“预测值和实际标签值的差异”的模型。 在本书大部分章节中,我们将关注最小化平方误差损失函数。

  • 这种“哪一个?”的问题叫做分类(classification)问题。 在分类问题中,我们希望模型能够预测样本属于哪个类别(category,正式称为类(class))。 例如,对于手写数字,我们可能有10类,分别数字0到9。当我们有两个以上的类别时,我们把这个问题称为多元分类(multiclass classification)问题。 常见的例子包括手写字符识别 。 与解决回归问题不同,分类问题的常见损失函数被称为交叉熵(cross-entropy)

  • 标记问题,学习预测不相互排斥的类别的问题称为多标签分类(multi-label classification)。 举个例子,人们在技术博客上贴的标签,比如“机器学习”、“技术”、“小工具”、“编程语言”、“Linux”、“云计算”、“AWS”。 一篇典型的文章可能会用5-10个标签,因为这些概念是相互关联的

2.无监督学习

你的老板可能会给你一大堆数据,然后让你用它做一些数据科学研究,却没有对结果有要求。 我们称这类数据中不含有“目标”的机器学习问题为无监督学习(unsupervised learning), 我们将在后面的章节中讨论无监督学习技术。

  • 聚类问题:常见的有K-Means,随机森林等,用来给一组随机数据进行分类。
  • 主成分分析问题:我们能否找到少量的参数来准确地捕捉数据的线性相关属性?比如,一个球的运动轨迹可以用球的速度、直径和质量来描述。再比如,裁缝们已经开发出了一小部分参数,这些参数相当准确地描述了人体的形状,以适应衣服的需要。另一个例子:在欧几里得空间中是否存在一种(任意结构的)对象的表示,使其符号属性能够很好地匹配?这可以用来描述实体及其关系,例如“罗马” “意大利” “法国” “巴黎”。
  • 因果关系(causality)和概率图模型(probabilistic graphical models)问题:我们能否描述观察到的许多数据的根本原因?例如,如果我们有关于房价、污染、犯罪、地理位置、教育和工资的人口统计数据,我们能否简单地根据经验数据发现它们之间的关系?
  • 生成对抗性网络(generative adversarial networks):为我们提供一种合成数据的方法,甚至像图像和音频这样复杂的非结构化数据。潜在的统计机制是检查真实和虚假数据是否相同的测试,它是无监督学习的另一个重要而令人兴奋的领域

3.强化学习

如果你对使用机器学习开发与环境交互并采取行动感兴趣,那么你最终可能会专注于强化学习(reinforcement learning)。 这可能包括应用到机器人、对话系统,甚至开发视频游戏的人工智能(AI)。 深度强化学习(deep reinforcement learning)将深度学习应用于强化学习的问题,是非常热门的研究领域。 突破性的深度Q网络(Q-network)在雅达利游戏中仅使用视觉输入就击败了人类, 以及 AlphaGo 程序在棋盘游戏围棋中击败了世界冠军,是两个突出强化学习的例子。

4.入门知识

首先,我们介绍n维数组,也称为张量(tensor)。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架,它的张量类(在MXNet中为ndarray, 在PyTorch和TensorFlow中为Tensor)都与Numpy的ndarray类似。 但深度学习框架又比Numpy的ndarray多一些重要功能: 首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算; 其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。 如果没有特殊说明,本书中所说的张量均指的是张量类的实例。

  • 首先,我们可以使用 arange 创建一个行向量 x。这个行向量包含以0开始的前12个整数,它们默认创建为整数。也可指定创建类型为浮点数。张量中的每个值都称为张量的 元素(element)。例如,张量 x 中有 12 个元素。除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

  • 要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。 例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。 这个新的张量包含与转换前相同的值,但是它被看成一个3行4列的矩阵。 要重点说明一下,虽然张量的形状发生了改变,但其元素值并没有变。 注意,通过改变张量的形状,张量的大小不会改变

  • 我们不需要通过手动指定每个维度来改变形状。 也就是说,如果我们的目标形状是(高度,宽度), 那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。 在上面的例子中,为了获得一个3行的矩阵,我们手动指定了它有3行和4列。 幸运的是,我们可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)或x.reshape(3,-1)来取代x.reshape(3,4)。

  • 有时,我们希望使用全0、全1、其他常量,或者从特定分布中随机采样的数字来初始化矩阵。 我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。 x = x.zeros((2,3,4))

  • 同样,我们可以创建一个形状为(2,3,4)的张量,其中所有元素都设置为1
    y = y.ones(2,3,4)

  • 有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。 例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。 以下代码创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样. y = torch.randn((3,4))

  • 对于任意具有相同形状的张量, 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。 x ** y # **运算符是求幂运算

  • y = torch.exp(x) y=e的xi次方组成的和x相同维度的张量

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

结果:
动手学机器学习——数据预处理&线性代数_第1张图片

  • 对张量中的所有元素进行求和,会产生一个单元素张量。
    动手学机器学习——数据预处理&线性代数_第2张图片
  • 广播机制 由于a和b分别是和矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播为一个更大的矩阵,如下所示:矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。
    动手学机器学习——数据预处理&线性代数_第3张图片
  • 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。如下所示,我们可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素。
    动手学机器学习——数据预处理&线性代数_第4张图片

这里需要注意的是,因为X为二维数组,它是包含了3个1行4列的数组,直接用X[-1]表示的是拿最后一个1行4列,所以结果是一个1行4列的一维数组。
并且切片是前闭后开

  • 这里的X[行切片,列切片] :
    动手学机器学习——数据预处理&线性代数_第5张图片
  • Z = torch.zeros_like(Y) 这个功能就是字面意思,创建一个和Y有相同形状的0矩阵
    动手学机器学习——数据预处理&线性代数_第6张图片
  • 在进行模型训练的时候,loss数值每次相加和展示都是实用的loss.item(),这是将tensor数据类型转化为数值类型。
    动手学机器学习——数据预处理&线性代数_第7张图片

5.数据预处理

  • 要从创建的CSV文件中加载原始数据集,我们导入pandas包并调用read_csv函数
    动手学机器学习——数据预处理&线性代数_第8张图片
  • 处理缺失值,一种是插值,一种是删除
    通过位置索引iloc,我们将data分成inputs和outputs, 其中前者为data的前两列,而后者为data的最后一列。 对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项。
    动手学机器学习——数据预处理&线性代数_第9张图片
  • 数据填充使用 inputs = inputs.fillna(inputs.mean()) 将inputs数组中所有的缺失值都用该列的均值进行填充。
  • 转换为张量格式 inputs = torch.tensor(inputs.values)

6.线性代数

  • 严格来说,我们称仅包含一个数值的叫标量(scalar),所以tensorboard中的writer.add_scalar(“name”, scalar, step) 用来记录loss的变化趋势。
  • 你可以将向量视为标量值组成的列表。 我们将这些标量值称为向量的元素(element)或分量(component)
    动手学机器学习——数据预处理&线性代数_第10张图片
  • 现在我们在代码中访问矩阵的转置
    动手学机器学习——数据预处理&线性代数_第11张图片
  • 当我们开始处理图像时,张量将变得更加重要,图像以维数组形式出现, 其中3个轴对应于高度、宽度,以及一个通道(channel)轴, 用于表示颜色通道(红色、绿色和蓝色)
    动手学机器学习——数据预处理&线性代数_第12张图片
  • 默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),我们可以在调用函数时指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。 指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。
    动手学机器学习——数据预处理&线性代数_第13张图片
  • 同时,除了sum,还有mean,都是可以通过axis进行维度控制,axis=0,算的是行的均值,即从第一列开始,求均值,所以最后是4个,如果axis=1,算的是列的均值,定下来行的值,遍历列进行均值求解。
    动手学机器学习——数据预处理&线性代数_第14张图片

注意的是axis=0是对行求和,不是每一行求和,是按照行的遍历顺序,求每行的第i个元素的sum或者是mean值,1则是反之。

5.1非降维求和

有时在调用函数来计算总和或均值时保持轴数不变会很有用
动手学机器学习——数据预处理&线性代数_第15张图片
动手学机器学习——数据预处理&线性代数_第16张图片
如果我们想沿某个轴计算A元素的累积总和, 比如axis=0(按行计算),我们可以调用cumsum函数。 此函数不会沿任何轴降低输入张量的维度。依次相加赋值的形式进行数据处理。
动手学机器学习——数据预处理&线性代数_第17张图片

6.2点积

动手学机器学习——数据预处理&线性代数_第18张图片
动手学机器学习——数据预处理&线性代数_第19张图片
动手学机器学习——数据预处理&线性代数_第20张图片
tensor.arange(5)出现的tensor数据不是矩阵,是向量,一定要注意
动手学机器学习——数据预处理&线性代数_第21张图片

6.3矩阵乘法

动手学机器学习——数据预处理&线性代数_第22张图片

6.3 范数

L2范数:
动手学机器学习——数据预处理&线性代数_第23张图片

L2范数就是元素的平方和再开方使用torch.norm(tensor)进行计算。

L1范数:
动手学机器学习——数据预处理&线性代数_第24张图片
将1,2带入就可以得到范数公式
在这里插入图片描述

Frobenius范数(Frobenius norm)
动手学机器学习——数据预处理&线性代数_第25张图片

你可能感兴趣的:(Pytorch,深度学习记录)