Chcę ustandaryzować moje dane wejściowe dla sieci neuronowej.

Dane wyglądają tak:

data= np.array([[0,0,0,0,233,2,0,0,0],[0,0,0,23,50,2,0,0,0],[0,0,0,0,3,20,3,0,0]])

To jest funkcja, której użyłem. Nie działa z powodu zer.

def standardize(data): #dataframe
    _,c = data.shape
    data_standardized = data.copy(deep=True)
    for j in range(c):
        x = data_standardized.iloc[:, j]
        avg = x.mean()
        std = x.std()
        x_standardized = (x - avg)/ std
        data_standardized.iloc[:, j] = x_standardized

    return data_standardized
1
Steven 20 listopad 2019, 22:26
Co masz na myśli, mówiąc, że to nie działa z powodu zer. Jaki błąd otrzymujesz?
 – 
Poojan
20 listopad 2019, 22:29
Jeśli pierwsza cecha wszystkich próbek wynosi zero, to otrzymuję sdt = 0, więc div. przez zero
 – 
Steven
20 listopad 2019, 22:32
Spójrz na tę odpowiedź, to pomoże. stackoverflow.com/ pytania/26248654/…. Po podzieleniu przez zero można to przyjąć jako 0.
 – 
Poojan
20 listopad 2019, 22:49

1 odpowiedź

Użyj indeksowania logicznego, aby uniknąć dzielenia przez zero:

In [90]: data= np.array([[0,0,0,0,233,2,0,0,0],[0,0,0,23,50,2,0,0,0],[0,0,0,0,3,20,3,0,0]])

In [91]: new = np.zeros(data.shape)

In [92]: m = data.mean(0)

In [93]: std = data.std(0)

In [94]: r = data-m

In [95]: new[:,std.nonzero()] = r[:,std.nonzero()]/std[std.nonzero()]

In [96]: new
Out[96]: 
array([[ 0.        ,  0.        ,  0.        , -0.70710678,  1.3875163 ,
        -0.70710678, -0.70710678,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  1.41421356, -0.45690609,
        -0.70710678, -0.70710678,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.70710678, -0.9306102 ,
         1.41421356,  1.41421356,  0.        ,  0.        ]])

Możesz też użyć sklearn.preprocessing.StandardScaler.


Twoja funkcja została refaktoryzowana:

def standardize(data): #dataframe
    data = data.values
    new = np.zeros(data.shape)
    m = data.mean(0)
    std = data.std(0)
    new[:,std.nonzero()] = r[:,std.nonzero()]/std[std.nonzero()]
    return pd.DataFrame(new)
0
wwii 21 listopad 2019, 18:07