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 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)
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.