Normalization
如何測量不同尺度特徵的距離?
我正在閱讀“集體智能”一書,在其中一章中,他們介紹瞭如何使用歐幾里德距離測量電影評論網站上用戶之間的相似性。
現在所有電影的評分都在 1-5 之間。但是,如果我想根據諸如身高、身體寬度、體重以及眼距與鼻子長度之比等特徵找到相似的用戶怎麼辦。該特徵在不同的尺度上起作用,因此例如身高對距離的影響遠大於眼鼻比。
我的問題是處理這個例子的最佳方法是什麼。應該使用不同的距離度量(哪個?),還是以某種方式標準化數據並使用歐幾里得距離?
對於這個非常常見的問題(即過度加權變量),一個非常常見的解決方案是標準化您的數據。
為此,您只需對數據執行兩個連續的按列操作:
- 減去平均值和
- 除以標準差
例如,在NumPy中:
>>> # first create a small data matrix comprised of three variables >>> # having three different 'scales' (means and variances) >>> a = 10*NP.random.rand(6) >>> b = 50*NP.random.rand(6) >>> c = 2*NP.random.rand(6) >>> A = NP.column_stack((a, b, c)) >>> A # the pre-standardized data array([[ 1.753, 37.809, 1.181], [ 1.386, 8.333, 0.235], [ 2.827, 40.5 , 0.625], [ 5.516, 47.202, 0.183], [ 0.599, 27.017, 1.054], [ 8.918, 35.398, 1.602]]) >>> # mean center the data (columnwise) >>> A -= NP.mean(A, axis=0) >>> A array([[ -1.747, 5.099, 0.368], [ -2.114, -24.377, -0.578], [ -0.673, 7.79 , -0.189], [ 2.016, 14.493, -0.631], [ -2.901, -5.693, 0.24 ], [ 5.418, 2.688, 0.789]]) >>> # divide by the standard deviation >>> A /= NP.std(A, axis=0) >>> A array([[-0.606, 0.409, 0.716], [-0.734, -1.957, -1.125], [-0.233, 0.626, -0.367], [ 0.7 , 1.164, -1.228], [-1.007, -0.457, 0.468], [ 1.881, 0.216, 1.536]])