時間序列表示方法

這是我參與8月更文挑戰的第9天,活動詳情查看: 8月更文挑戰html

天然界中,除了2D、3D的圖片、視頻駛距之外,更多的是一些相似於序列的數據,好比語音、文字,這些數據都是有時間前後順序的python

如今就有這樣一個問題,對於一個2D圖片順序,咱們用一個像素點的RGB值來表示這個像素的色彩度。可是對於語音、文字該如何表示呢?markdown

語音在某一個時間段會產生一段波形,這段波形中波峯值就能夠表示此刻聲音的強度。對於一段文字中的字符也能夠表示。可是在PyTorch中是沒有string類型的,咱們必需要把string類型表示爲另一種數值類型。如何進行時間序列的表示(Representation),如何進行時間序列的**信息提取(Information Extraction )**就成了時間序列研究的關鍵問題app

Sequence Representation

  • [ seq_len , feature_len ] [\text{seq\_len}, \text{feature\_len}]

假設一句話有5個單詞,那麼 seq_len = 5 \text{seq\_len}=5 ,而 feature_len \text{feature\_len} 取決於你的應用場景,比方說每一個單詞用一個1維向量來表示,那麼 feature_len = 1 \text{feature\_len}=1 ,若是每一個單詞用一個100維向量來表示,那麼 feature_len = 100 \text{feature\_len}=100 函數

例以下圖的歷史房價圖,所採用的表示方式就是[100,1]post

How to represent a word

一般咱們會使用one-hot Encoding的方式對文字進行編碼,看下面的一個例子ui

假設有下面的兩句話:編碼

  • have a good day
  • have a great day

這兩句話共有5個詞彙,因而能夠用 V V 表示,其中 V = { have , a , good , great , day } V=\{\text{have}, \text{a}, \text{good}, \text{great}, \text{day}\} 。由於有5個詞彙,因此每一個詞彙都用一個5維的向量進行表示,以下所示:spa

  • 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]

但這麼作有如下的缺點:3d

  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分別表明着這個詞的一種屬性,好比a表明是否喜歡玩球,b表明是否喜歡玩毛線,數值越大表示越喜歡,那麼咱們就能用數值來定義每個單詞

對於cat,咱們能夠定義他的word embedding爲(-1, 4),由於它不喜歡玩球,喜歡玩毛線;kitty爲(-2, 5);dog爲(3, -2);boy爲(-2,-3)。把這四個向量在座標系中表示出來

從上圖就能明顯看出kitty和cat的夾角比較小,因此它們比較類似,dog和boy之間的夾角很大,因此它們不類似

下面說一下具體公式。對於向量 x , y R d \boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d ,它們的餘弦類似度是它們之間夾角的餘弦值

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

在PyTorch中Word Embedding是經過一個函數來實現的nn.Embedding

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)
複製代碼

輸出

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)

相關文章
相關標籤/搜索