Java之Normalizer(歸一化)

什麼是歸一化?

歸一化的概念在人工智能領域會普通看到, 比如使用TensorFlow框架編碼時,就會出現數據歸一化的步驟或函數。
簡單來說, 歸一化就是對一組數據進行轉換,使這組數據具備相同的格式或特性。舉例來說: 一組任意的整數數組:1,2,400,5000, 如果每個數都除以這組元素中的最大值的話(這裏是5000),則這個數組元素的值位於0-1之間,滿足數學上概率的值的區間。

在AI中,對培訓數據進行歸一化的好處有:
1、保持合適的樣本間距
以上面的示例來說, 1和5000相差甚遠,如果以座標圖繪製,則相差的太遠, 歸一化之後就好多了。
2、平等對待多個特徵向量。
有個例子示房子面積和房子的數量對房價的影響。面積的體量明顯大於房子的數目,面積的因素很容易掩蓋數量的影響。所以,歸一化之後,更容易找到問題的解。

歸一化的數學方法

歸一化常見的數學方法有:

  • 線性歸一化
    也稱作(0,1)標準化 線性歸一化 , Min-Max標準化和離差標準化。是對原始數據進行線性變換,變換後的結果值在0到1之間。
    公式是: X = (x-Min)/(Max-Min)

  • 均值標準差歸一化
    使用均值和標準差進行數據的標準化。轉換後的數據符合正態分佈, 即均值爲0, 標準差爲1。
    公式是:X= x-均值/標準差

  • 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),但是漢字等有成千上百個,於是出現了 GB2312、GBK、Unicode等編碼。
Unicode(統一碼、萬國碼、單一碼),是業界統一的標準,該標準更多兩個字節來表示字符(最多可以表示65536個字符)。 但這個標準又有不同的版本,比如UTF-8、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()方法有兩個參數:

  • 第一個參數是需要歸一化的字符串

  • 第二個參數是Unicode規範化的類型,該類型參數有四種:

    1. NFD 典型分解
    2. NFC 兼容性分解
    3. NFKD 規範分解,規範組成
    4. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章