2017-10-24 10 views
3

私は配列を正規化するはずです。私は、正規化について読み、式に遭遇しました:正規化VS.ノーマライズする方法

enter image description here

私はそれのために次の関数を書いた:要素の配列を正規化することになっている

def normalize_list(list): 
    max_value = max(list) 
    min_value = min(list) 
    for i in range(0, len(list)): 
     list[i] = (list[i] - min_value)/(max_value - min_value) 

は、その後、私はこれを越えcomed持っている:https://stackoverflow.com/a/21031303/6209399あなたは、単にこれを行うことにより、配列を正規化することができます言う :

def normalize_list_numpy(list): 
    normalized_list = list/np.linalg.norm(list) 
    return normalized_list 

私は私自身の機能で、このテストアレイtest_array = [1, 2, 3, 4, 5, 6, 7, 8, 9]を正規化した場合とで私はこれらの答えを得るnumpyの方法:

My own function: [0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0] 
The numpy way: [0.059234887775909233, 0.11846977555181847, 0.17770466332772769, 0.23693955110363693, 0.29617443887954614, 0.35540932665545538, 0.41464421443136462, 0.47387910220727386, 0.5331139899831830 

なぜ関数は異なる答えを出すのですか?データの配列を正規化する他の方法はありますか? numpy.linalg.norm(list)は何をしますか?私は何を理解していないのですか?

+2

これは正規表現の伝統的な式ではありません。通常は(x-x_mean)/ stdev(x)と表現されています。 (標準偏差は標準偏差です) –

+0

Bradと同意します。あなたの数式は、値を区間[0、1]にスケーリングしますが、 "正規化"は平均0と分散1(統計で)に変換することを意味します。 )。 – phg

+0

これは「標準化」と呼ばれていませんか? @phu – OuuGiii

答えて

2

あなたが参照する質問/回答は、ここで使用するnp.linalg.norm(list)バージョンに独自の公式を明示的に関連付けるものではありません。

つnumpyの溶液は、このようになります:ここ

import numpy as np 
def normalize(x): 
    x = np.asarray(x) 
    return (x - x.min())/(np.ptp(x)) 

print(normalize(test_array))  
# [ 0.  0.125 0.25 0.375 0.5 0.625 0.75 0.875 1. ] 

np.ptp

値の範囲(最大値 - 最小値)、すなわちピーク・ツー・ピークである軸に沿っ。

このアプローチは、@phgによって指摘されているように、値を[0、1]にスケールします。

正規のより伝統的な定義は、0平均および単位分散にスケーリングするであろう:

x = np.asarray(test_array) 
res = (x - x.mean())/x.std() 
print(res.mean(), res.std()) 
# 0.0 1.0 

またはプレ缶詰関数としてsklearn.preprocessing.normalizeを使用します。

を使用すると、test_array/np.linalg.norm(test_array)は単位長の結果を作成します。 np.linalg.norm(test_array/np.linalg.norm(test_array))が1に等しいことがわかります。ここでは、2つの異なるフィールドについて話しています.1つは統計であり、もう1つは線形代数です。

+0

ありがとうございますが、関数normalize_list_numpy()は何をしますか? – OuuGiii

+1

@OuuGiiiこれはベクトルの長さを1にします。 – phg

+0

@OuuGiii @phgのコメントを理解するために 'np.linalg.norm(test_array/np.linalg.norm(test_array))'の結果を見てください。 –

3

正規化にはさまざまな種類があります。 min-max正規化を使用しています。 scikit学習からのmin-max正規化は以下のとおりです。

import numpy as np 
from sklearn.preprocessing import minmax_scale 

# your function 
def normalize_list(list_normal): 
    max_value = max(list_normal) 
    min_value = min(list_normal) 
    for i in range(len(list_normal)): 
     list_normal[i] = (list_normal[i] - min_value)/(max_value - min_value) 
    return list_normal 

#Scikit learn version 
def normalize_list_numpy(list_numpy): 
    normalized_list = minmax_scale(list_numpy) 
    return normalized_list 

test_array = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
test_array_numpy = np.array(test_array) 

print(normalize_list(test_array)) 
print(normalize_list_numpy(test_array_numpy)) 

出力:

[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0]  
[0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0] 

MinMaxscalerは、正規化/スケーリングのため、正確にあなたの式を使用しています。 http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.minmax_scale.html

@OuuGiii:注: Pythonの組み込みを使用することは良い考えではありませんvaribaleの名前として関数名で指定します。 list()はPythonの組み込み関数なので、変数としての使用は避けるべきです。

+1

これは分かっていませんでした、+1。 @OuuGiiこの関数のドキュメントから直接、 "この変換はゼロ平均、単位分散スケーリングの代替としてよく使われます。" –

+0

@BradSolomonこれは、svmやknnなどのさまざまな機密分類子に供給される前に、機能スケーリングのためにSklearnで頻繁に使用されます。 – utengr

関連する問題