web-dev-qa-db-ja.com

正規化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)
_

それは要素の配列を正規化することになっています。

それから私はこれに遭遇しました: 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)は何をしますか?何がいけないのですか?

7
OuuGiii

正規化にはさまざまなタイプがあります。 min-max正規化を使用しています。 scikit learnの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組み込み関数名を変数名として使用することはお勧めできません。 list()はPython組み込み関数であるため、変数としての使用は避けてください。

8
utengr

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

NumPyソリューションの1つは次のとおりです。

_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と単位分散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つは線形代数です。

5
Brad Solomon

pythonの威力は、その broadcasting プロパティです。これにより、明示的なループなしで配列演算をベクトル化できます。したがって、明示的なforを使用して関数を記述する必要はありません。特にデータセットが大きすぎる場合は、ループと時間がかかります。

min-max正規化 を行うPythonの方法は

test_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
normalized_test_array = (test_array - min(test_array)) / (max(test_array) - min(test_array)) 

出力>> [0.、0.125、0.25、0.375、0.5、0.625、0.75、0.875、1.]

1
ewalel