1. 程式人生 > 其它 >標準化/歸一化

標準化/歸一化

資料標準化是一個常用的資料預處理操作,目的是處理不同規模和量綱的資料,使其縮放到相同的資料區間和範圍,以減少規模、特徵、分佈差異等對模型的影響。

標準化(Z-Score)

  • Z-Score標準化是基於原始資料的均值和標準差進行的標準化,假設原轉換的資料為x,新資料為x′,那麼x'=(x-mean)/std,其中mean和std為x所在列的均值和標準差。
  • 這種方法適合大多數型別的資料,也是很多工具的預設標準化方法。標準化之後的資料是以0為均值,方差為1的正態分佈。但是Z-Score方法是一種中心化方法,會改變原有資料的分佈結構,不適合對稀疏資料做處理。

歸一化(Max-Min)

  • Max-Min標準化方法是對原始資料進行線性變換,假設原轉換的資料為x,新資料為x′,那麼x'=(x-min)/(max-min),其中min和max為x所在列的最小值和最大值。

  • 這種標準化方法的應用非常廣泛,得到的資料會完全落入[0,1]區間內(Z-Score則沒有類似區間)。這種方法能使資料歸一化而落到一定的區間內,同時還能較好地保持原有資料結構。

讀取資料

import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
data = np.loadtxt('data6.txt', delimiter='\t')  # 讀取資料
data
#列印結果
array([[ 8.9 , 10.4 ],
       [ 7.76,  4.68],
       [ 7.54,  3.84],
       ...,
       [ 2.26,  5.14],
       [ 2.17,  3.54],
       [ 1.95,  3.81]])

Z-Score標準化

# Z-Score標準化
zscore_scaler = preprocessing.StandardScaler()  # 建立StandardScaler物件
data_scale_1 = zscore_scaler.fit_transform(data)  # StandardScaler標準化處理

data_scale_1 
#列印結果
array([[ 3.95979742,  6.25657217],
       [ 2.80473492,  0.49961714],
       [ 2.58182812, -0.34580982],
       ...,
       [-2.76793503,  0.96258905],
       [-2.85912418, -0.64774802],
       [-3.08203098, -0.37600364]])

歸一化Max-Min

minmax_scaler = preprocessing.MinMaxScaler()  # 建立MinMaxScaler模型物件
data_scale_2 = minmax_scaler.fit_transform(data)  # MinMaxScaler標準化處理

data_scale_2
#列印結果
array([[1.        , 1.        ],
       [0.83597122, 0.37758433],
       [0.80431655, 0.28618063],
       ...,
       [0.04460432, 0.42763874],
       [0.03165468, 0.25353645],
       [0.        , 0.28291621]])

展示多網格結果

# 展示多網格結果
data_list = [data, data_scale_1, data_scale_2]  # 建立資料集列表
color_list = ['black', 'green', 'blue']  # 建立顏色列表
merker_list = ['o', ',', '+']  # 建立樣式列表
title_list = ['source data', 'zscore_scaler', 'minmax_scaler']  # 建立標題列表
plt.figure(figsize=(13, 3)) #指定繪圖區域的大小
for i, data_single in enumerate(data_list):  # 迴圈得到索引和每個數值
    plt.subplot(1, 3, i + 1)  # 確定子網格,一行三列,i是從0開始
    plt.scatter(data_single[:,:-1], data_single[:, -1], s=10, marker=merker_list[i],c=color_list[i])  # 自網格展示散點圖  
                # d=a[:-1]  #從位置0到位置-1之前的數;s是點的大小,merker_list畫圖樣式列表,c顏色列表
    plt.title(title_list[i])  # 設定自網格標題
plt.suptitle("raw data and standardized data")  # 設定總標題
#Text(0.5, 0.98, 'raw data and standardized data')