首頁/ 汽車/ 正文

詳解one-hot獨熱編碼

1。 one-hot 獨熱

獨熱,是機器學習中初學者經常聽到的一個詞。

從字面意義看,獨表示唯獨,一家獨大,獨佔鰲頭,獨熱表示只有1個熱,其他都是涼的。

事實也是如此。

我們來看一個獨熱編碼的例子:

[0, 1, 0, 0, 0]

可以看到,上面只有一個1,其他都是涼涼的0,這就是獨熱。

假設,我們有5種狀態:金、木、水、火、土。我們給這5個狀態留了5個空,它們都有專門的位置。

數字

位置編號

0

1

2

3

4

自從有了這個規則以後,但凡是老金出現,都是以這種狀態示人:[1, 0, 0, 0, 0],我有5個兄弟,我表示第一個。老土出現那就是:[0, 0, 0, 0, 1]。

如果兩個一起出現,是這樣式的:[[1, 0, 0, 0, 0],[0, 0, 0, 0, 1]]。

這就是獨熱的表示。

2。 為什麼要用獨熱?

為什麼會用這種奇怪的方式表示呢?老金直接是0,老土直接是4不就完了?

其實這麼做是有目的的。

獨熱是為了體現公平。每次出現都攜帶著團隊成員的數量,避免了招搖撞騙,說房子是自己的,其實自己只佔幾分之一。另外,每個成員只能是1,只是用來標記是不是你,無法誇大你的比重,比如展示成[99, 0, 0, 0, 0],這樣就不是獨熱的標準。

透過獨熱的編碼標準,使得計算時,公平公正。大家的值都是1,避免了你是1我是2,出現誰大誰小從而干擾計算。

如果,你的基礎學科比較好的話,其實我上面說那麼多,都是下面的通俗化:

大部分演算法是基於向量空間中的度量來進行計算的,為了使非偏序關係的變數取值不具備偏序性,而且到圓點是等距的。使用one-hot編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。將離散型特徵使用one-hot編碼,會讓特徵之間的距離計算更加合理。

3。 獨熱的侷限

雖然,獨熱編碼有優勢。但是,它也是有侷限性的。

獨熱適合表示少量的,無關聯的資料。

首先說它不適合大量的資料。如果總共有5條資料,那其中一條是這麼表示[1, 0, 0, 0, 0],如果是10條,這麼表示[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]。如果是5000條,那就是1個1,4999個0。這種情況,術語上叫過於稀疏,反而不利於計算。

另外,也是因為獨熱很公正公平,所以導致成員間沒有個人關係。有時候,尤其當自然語言處理時,我們很希望能表示出每個詞語間的相關性。

比如,我們要表示心情好壞程度,有如下幾種心情:悲傷、鬱悶、無聊、微笑、大笑、爆笑。那麼,我們假設以0為中心點,負面的情緒定義為負數,正面的情緒定義為正數。上面幾種狀態可以這麼表示:

心情

表示

悲傷

-3

鬱悶

-2

無聊

-1

微笑

1

大笑

2

爆笑

3

這樣,我們就可以瞭解他們之間的關係了:爆笑(3)程度要大於微笑(1)。大笑(2)和鬱悶(-2)是完全相反的狀態。

這種帶成員關係的資料,就不合適用獨熱來表示了。

4。 獨熱的應用場景

一般的分類問題,比如手寫數字識別,OCR識別,花朵種類識別。

TensorFlow提供了一個將數值轉換為獨熱編碼的方法:

import tensorflow as tflabels = [1,2,3]ys = tf。keras。utils。to_categorical(labels, 5)print(ys)

最終輸出的結果:

[[0。 1。 0。 0。 0。] [0。 0。 1。 0。 0。] [0。 0。 0。 1。 0。]]

此方法很有用,因為一般訓練集標記的不是獨熱編碼,比如手寫識別結果儲存都是具體的:3、6、2,我們可以使用to_categorical來轉化為獨熱編碼。

相關文章

頂部