Нормализация набора данных в python - PullRequest
0 голосов
/ 13 февраля 2020

Я работаю над набором данных, в котором есть записи, подобные этой

dataset=np.array([[2104,    3],[1600,   3],
                  [2400,    3],[1416,   2],
                  [3000,    4],[1985,   4],
                  [1534,    3],[1427,   3],
                  [1380,    3],[1494,   3],
                  [1940,    4],[2000,   3],
                  [1890,    3],[4478,   5],
                  [1268,    3]])

, как очевидно, все записи имеют тип int32 , и мне также нужно масштабировать функции в том же масштабе. Поэтому, когда я пытаюсь нормализовать их, используя стандартную нормализацию (z) статистики, которая равна

z=(x-mean)/sigma

Все значения в наборе данных становятся равными нулю. Я использую векторизованный метод. Вот код.

me=[]
sd=[]
for i in range(dataset.shape[1]):
    m=np.mean(dataset[:,i])
    sdd=np.std(dataset[:,i])
    dataset[:,i]=(dataset[:,i]-m)
    dataset[:,i]=dataset[:,i]/sdd
    me.append(m)
    sd.append(sdd)

after executing code

Это то, что я получаю, когда выполняю приведенный выше фрагмент кода.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Не надо л oop. Вы можете использовать numpy * std и mean, взятые вдоль первой оси:

(dataset-dataset.mean(0))/dataset.std(0)

array([[ 0.13736137, -0.39223227],
       [-0.49430039, -0.39223227],
       [ 0.50833732, -0.39223227],
       [-0.72490707, -1.86310328],
       [ 1.2603156 ,  1.07863874],
       [-0.01178099,  1.07863874],
       [-0.577018  , -0.39223227],
       [-0.7111208 , -0.39223227],
       [-0.77002576, -0.39223227],
       [-0.62714989, -0.39223227],
       [-0.06817936,  1.07863874],
       [ 0.00701846, -0.39223227],
       [-0.13084422, -0.39223227],
       [ 3.11268878,  2.54950976],
       [-0.91039504, -0.39223227]])

Или вы также можете использовать StandardScaler: 1010 *

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit_transform(dataset)

array([[ 0.13736137, -0.39223227],
       [-0.49430039, -0.39223227],
       [ 0.50833732, -0.39223227],
       [-0.72490707, -1.86310328],
       [ 1.2603156 ,  1.07863874],
       [-0.01178099,  1.07863874],
       [-0.577018  , -0.39223227],
       [-0.7111208 , -0.39223227],
       [-0.77002576, -0.39223227],
       [-0.62714989, -0.39223227],
       [-0.06817936,  1.07863874],
       [ 0.00701846, -0.39223227],
       [-0.13084422, -0.39223227],
       [ 3.11268878,  2.54950976],
       [-0.91039504, -0.39223227]])
0 голосов
/ 13 февраля 2020

Я невооруженным глазом вижу, что вы слишком много раз используете значение dataset[:,i]. Это антипаттерн. Что ж, если вы сделаете рефакторинг, чтобы сделать ваш сценарий более читабельным?

me, sd=[], []
for i in range(dataset.shape[1]):
    X = dataset[:,i]
    m=np.mean(X)
    sdd=np.std(X)
    X=(X-m)
    X=X/sdd
    me.append(m)
    sd.append(sdd)

И, поскольку me и sd не помогают свести к минимуму ваш пример, даже больше:

for i in range(dataset.shape[1]):
    X = dataset[:,i]
    dataset[:,i] = (X-np.mean(X))/np.std(X)

Кстати, использование операций со списком, таких как append, не рекомендуется при работе с numpy. Теперь

dataset = dataset.astype(float)
for i in range(dataset.shape[1]):
    X = dataset[:,i]
    dataset[:,i] = (X-np.mean(X))/np.std(X)

делает свое дело.

...