2016-01-06 7 views
0

У меня есть списки значений, которые я хочу масштабировать, чтобы соответствовать определенным стандартным отклонениям и средним требованиям. В частности, я хочу, чтобы наборы данных были стандартизированы равными 0 со стандартным отклонением 1, за исключением наборов данных, для которых все значения больше 0; Я хочу масштабировать таким образом, чтобы их среднее значение равно 1.Как следует масштабировать значения списка, чтобы они соответствовали стандартным отклонениям и средним требованиям?

Что было бы хорошим способом сделать этот тип вещей в Python?

+0

Я думаю, вы пытаетесь решить набор уравнений для удовлетворения определенных значений. Вы должны искать «поиск цели python» или «решатель уравнения python». –

ответ

2

Если вы работаете с данными в Python, вы будете хотеть, чтобы быть с использованием стека науки (см here), в частности, numpy, scipy и pandas. То, что вы ищете, это zscore, и это довольно распространенная операция, которая встроена в scipy как scipy.stats.zscore.

Начиная от случайного массива с ненулевым средним и без единства STDDEV:

>>> import numpy as np 
>>> import scipy.stats 
>>> data = np.random.uniform(0, 100, 10**5) 
>>> data.mean(), data.std() 
(49.950550280158893, 28.910154760235972) 

Мы можем перенормировать:

>>> renormed = scipy.stats.zscore(data) 
>>> renormed.mean(), renormed.std() 
(2.0925483568134951e-16, 1.0) 

И смещаться, если мы хотим:

>>> if (data > 0).all(): 
...  renormed += 1 
...  
>>> renormed.mean(), renormed.std() 
(1.0000000000000002, 1.0) 

Мы могли бы сделать это вручную, конечно:

>>> (data - data.mean())/data.std() 
array([-0.65558504, 0.24264144, -0.1112242 , ..., -0.40785103, 
     -0.52998332, 0.10104563]) 

(Обратите внимание, что по умолчанию используется дельта-степень свободы 0, то есть знаменатель равен N. Если вы хотите N-1, пройдите ddof=1).