前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >时间序列表示方法

时间序列表示方法

作者头像
mathor
发布2020-01-27 09:36:31
1.1K0
发布2020-01-27 09:36:31
举报
文章被收录于专栏:mathor

自然界中,除了2D、3D的图片、视频驶距以外,更多的是一些类似于序列的数据,比如语音、文字,这些数据都是有时间先后顺序的

现在就有这样一个问题,对于一个2D图片顺序,我们用一个像素点的RGB值来表示这个像素的色彩度。但是对于语音、文字该如何表示呢?

语音在某一个时间段会产生一段波形,这段波形中波峰值就可以表示此刻声音的强度。对于一段文字中的字符也可以表示。但是在PyTorch中是没有string类型的,我们必须要把string类型表示为另外一种数值类型。如何进行时间序列的表示(Representation),如何进行时间序列的信息提取(Information Extraction )就成了时间序列研究的关键问题

Sequence Representation

  • $[seq\_len, feature\_len]$ 假设一句话有5个单词,那么$seq\_len=5$,而$feature\_len$取决于你的应用场景,比方说每个单词用一个1维向量来表示,那么$feature\_len=1$,如果每个单词用一个100维向量来表示,那么$feature\_len=100$

例如下图的历史房价图,所采用的表示方式就是[100,1]

How to represent a word

通常我们会使用one-hot Encoding的方式对文字进行编码,看下面的一个例子

假设有下面的两句话:

  • have a good day
  • have a great day 这两句话共有5个词汇,于是可以用$V$表示,其中$V={have, a, good, great, day}$。因为有5个词汇,所以每个词汇都用一个5维的向量进行表示,如下所示:
  • have = [1, 0, 0, 0, 0]
  • a = [0, 1, 0, 0, 0]
  • good = [0, 0, 1, 0, 0]
  • great = [0, 0, 0, 1, 0]
  • day = [0, 0, 0, 0, 1]

但这么做有以下的缺点:

  1. 每个word的vector都是独立的,所以使用one-hot Encoding没有体现单词语单词之间的关系
  2. 如果词汇量很多,则vector的维度会很大,同时造成数据稀疏问题

Word Embedding

上面one-hot Encoding存在很多问题,那么应该如何修改呢?我们可以用另一种方式去定义每一个单词——word embedding。下面这句话解释word embedding很合适

Word embeddings embed meaning of text in a vector space.(把文本的意思嵌入到向量空间中)

有一些词的词性是相近的,比如“love”和“like”,对于这种词性相近的词,我们需要他们的向量表示也能相近,如何度量和定义向量之间的相似程度呢?非常简单,就是使用两个向量的夹角,夹角越小,越相近。举个例子,下面有4段话

  1. The cat likes playing wool.
  2. The kitty likes playing wool.
  3. The dog likes playing ball
  4. The boy does not like playing ball or wool.

这里面有4个词,分别是cat,kitty,dog和boy。下面我们使用一个二维的词向量(a,b)来表示每一个词,其中a和b分别代表着这个词的一种属性,比如a代表是否喜欢玩球,b代表是否喜欢玩毛线,数值越大表示越喜欢,那么我们就能用数值来定义每一个单词

对于cat,我们可以定义他的word embedding为(-1, 4),因为它不喜欢玩球,喜欢玩毛线;kitty为(-2, 5);dog为(3, -2);boy为(-2,-3)。把这四个向量在坐标系中表示出来

从上图就能明显看出kitty和cat的夹角比较小,所以它们比较相似,dog和boy之间的夹角很大,所以它们不相似

下面说一下具体公式。对于向量$\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d$,它们的余弦相似度是它们之间夹角的余弦值

$$ \frac{\boldsymbol{x}^\top \boldsymbol{y}}{\|\boldsymbol{x}\| \|\boldsymbol{y}\|} \in [-1, 1]. $$

在PyTorch中Word Embedding是通过一个函数来实现的nn.Embedding

代码语言:javascript
复制
import torch
import torch.nn as nn

word_to_idx = {"hello": 0, "world": 1} # 给每个词打上索引

lookup_tensor = torch.tensor([word_to_idx["hello"]], dtype=torch.long) # 取出"hello"对应的索引

embeds = nn.Embedding(2, 5) # 2 words in vocab, 5 dimensional embeddings
hello_embed = embeds(lookup_tensor) # 传入索引

print(hello_embed)

输出

代码语言:javascript
复制
tensor([[-1.2999,  2.2142,  0.2436, -1.9585,  0.8714]],
       grad_fn=<EmbeddingBackward>)

稍微解释下这几行代码,首先因为每个单词都需要用一个数字去表示,所以我们要构建一个单词-数字之间的映射

然后是nn.Embedding(2, 5),2表示有2个词,5表示5维,其实也就是个2×5的矩阵。所以如果你有1000个词,每个词希望是100维,你就可以这样写这行代码nn.Embedding(1000, 100)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Sequence Representation
  • How to represent a word
  • Word Embedding
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档