什麼是歸一化?
歸一化的概念在人工智能領域會普通看到, 好比使用TensorFlow框架編碼時,就會出現數據歸一化的步驟或函數。
簡單來講, 歸一化就是對一組數據進行轉換,使這組數據具有相同的格式或特性。舉例來講: 一組任意的整數數組:1,2,400,5000, 若是每一個數都除以這組元素中的最大值的話(這裏是5000),則這個數組元素的值位於0-1之間,知足數學上機率的值的區間。
html
在AI中,對培訓數據進行歸一化的好處有:
1、保持合適的樣本間距
以上面的示例來講, 1和5000相差甚遠,若是以座標圖繪製,則相差的太遠, 歸一化以後就好多了。
二、平等對待多個特徵向量。
有個例子示房子面積和房子的數量對房價的影響。面積的體量明顯大於房子的數目,面積的因素很容易掩蓋數量的影響。因此,歸一化以後,更容易找到問題的解。
java
歸一化的數學方法
歸一化常見的數學方法有:api
-
線性歸一化
也稱做(0,1)標準化 線性歸一化 , Min-Max標準化和離差標準化。是對原始數據進行線性變換,變換後的結果值在0到1之間。
公式是: X = (x-Min)/(Max-Min)
數組 -
均值標準差歸一化
使用均值和標準差進行數據的標準化。轉換後的數據符合正態分佈, 即均值爲0, 標準差爲1。
公式是:X= x-均值/標準差
oracle -
Sigmoid函數歸一化框架
Java歸一化類Normalizer
JDK中提供了一個歸一化類:java.text.Normalizer , 和傳統的歸一化有點區別, 這個類主要是對字符串編碼的轉換。從該類的包名也能夠看出,這個類處理的是文本的數據。
爲何會有編碼的問題呢? 這個還要從計算機的原理提及, 計算機中使用1表示高電平,使用0表示低電平,簡單點理解就是電源要麼開,要麼關。
ASCII碼應該是最先熟悉的字符編碼了,(American Standard Code for Information Interchange): 美國信息交換標準代碼,其實用的是8個比特位(1)個字節來表示拉丁字母以及一些特殊字符,可是8個比特位最多能有256種表示方式(好比0100 0001 表示大寫的A, 換算成十進制是65,十六進制表示是0x41),可是漢字等有成千上百個,因而出現了 GB23十二、GBK、Unicode等編碼。
Unicode(統一碼、萬國碼、單一碼),是業界統一的標準,該標準更多兩個字節來表示字符(最多能夠表示65536個字符)。 但這個標準又有不一樣的版本,好比UTF-八、UTF-16和UTF-32。同一個字符可能出現不一樣的編碼方式。
好比 á (小寫a上面有一個第四聲),就有兩種編碼方式:
函數
- 編碼方式1:
00C1
, 一個字符表示 - 編碼方式2:
0041
+0301
, 兩個字符表示
雖然同是á , 可是在Java中進行字符串匹配是不相同的, 因此須要進行歸一化處理。 示例代碼以下:編碼
public class NormalizerTest { // á @Test public void base() { // 歸一化前 String str1 = "\u00C1"; System.out.println(str1); String str2 = "\u0041" + "\u0301"; System.out.println(str2); // Assert.assertTrue(str1.equals(str2)); //失敗 // 歸一化後 str1 = Normalizer.normalize(str1, Normalizer.Form.NFC); str2 = Normalizer.normalize(str2, Normalizer.Form.NFC); System.out.println(str1); System.out.println(str2); Assert.assertTrue(str1.equals(str2)); // 成功 } }
normalize()方法有兩個參數:人工智能
-
第一個參數是須要歸一化的字符串spa
-
第二個參數是Unicode規範化的類型,該類型參數有四種:
- NFD 典型分解
- NFC 兼容性分解
- NFKD 規範分解,規範組成
- NFKC 兼容性分解,規範組成
NF 是normalization-type的簡寫。
類型細節參考:
http://www.unicode.org/reports/tr15/tr15-23.html
Java的Normalizer類的說明參考: https://docs.oracle.com/javase/7/docs/api/java/text/Normalizer.html