値のリストを正規化して、確率分布、つまり0.0〜1.0に収まるようにする必要があります。
私はhowを正規化することを理解していますが、Pythonにこれを自動化する機能があれば興味がありました。
私はから行きたいです:
raw = [0.07, 0.14, 0.07]
に
normed = [0.25, 0.50, 0.25]
つかいます :
norm = [float(i)/sum(raw) for i in raw]
合計に対して常に正規化して、合計が常に1.0(またはできるだけ近い)になるようにします。
つかいます
norm = [float(i)/max(raw) for i in raw]
最大に対して正規化する
正規化するリストの長さはどれくらいですか?
def psum(it):
"This function makes explicit how many calls to sum() are done."
print "Another call!"
return sum(it)
raw = [0.07,0.14,0.07]
print "How many calls to sum()?"
print [ r/psum(raw) for r in raw]
print "\nAnd now?"
s = psum(raw)
print [ r/s for r in raw]
# if one doesn't want auxiliary variables, it can be done inside
# a list comprehension, but in my opinion it's quite Baroque
print "\nAnd now?"
print [ r/s for s in [psum(raw)] for r in raw]
出力
# How many calls to sum()?
# Another call!
# Another call!
# Another call!
# [0.25, 0.5, 0.25]
#
# And now?
# Another call!
# [0.25, 0.5, 0.25]
#
# And now?
# Another call!
# [0.25, 0.5, 0.25]
試してください:
normed = [i/sum(raw) for i in raw]
normed
[0.25, 0.5, 0.25]
リストに負の数がある場合、これはあなたがそれを正規化する方法です
a = range(-30,31,5)
norm = [(float(i)-min(a))/(max(a)-min(a)) for i in a]
(私の知る限りでは)標準ライブラリにはそれを行う関数はありませんが、そのような関数を持つモジュールは絶対にあります。ただし、独自の関数を作成するだけで十分に簡単です。
def normalize(lst):
s = sum(lst)
return map(lambda x: float(x)/s, lst)
サンプル出力:
>>> normed = normalize(raw)
>>> normed
[0.25, 0.5, 0.25]
numpy
の使用を検討する場合、より高速なソリューションを取得できます。
import random, time
import numpy as np
a = random.sample(range(1, 20000), 10000)
since = time.time(); b = [i/sum(a) for i in a]; print(time.time()-since)
# 0.7956490516662598
since = time.time(); c=np.array(a);d=c/sum(a); print(time.time()-since)
# 0.001413106918334961
これを試してください:
from __future__ import division
raw = [0.07, 0.14, 0.07]
def norm(input_list):
norm_list = list()
if isinstance(input_list, list):
sum_list = sum(input_list)
for value in input_list:
tmp = value /sum_list
norm_list.append(tmp)
return norm_list
print norm(raw)
これはあなたが尋ねたことをするでしょう。 しかし、最小-最大正規化を試すことをお勧めします。
最小-最大正規化:
def min_max_norm(dataset):
if isinstance(dataset, list):
norm_list = list()
min_value = min(dataset)
max_value = max(dataset)
for value in dataset:
tmp = (value - min_value) / (max_value - min_value)
norm_list.append(tmp)
return norm_list