Próbuję wykonać pewne obliczenia, ale nie mogę zrozumieć, jak векторизовать swój kod i nie używać cykle.
Pozwól mi wyjaśnić: mam matryca M[N,C]
z każdego 0
lub 1
. Jeszcze jedna matryca Y[N,1]
zawierające wartości [0,C-1]
(Moje zajęcia). Jeszcze jedna matryca ds[N,M]
to mój zestaw danych.
Moja wyjściowa macierz ma rozmiar grad[M,C]
i powinno być obliczone w następujący sposób: wyjaśnię dla grad[:,0]
ta sama logika dla innej kolumny.
Dla każdego wiersza(próbki) w ds
jeśli Y[that sample] != 0
(Kolumna wyjściowej matrycy) i M[that sample, 0] > 0
wtedy grad[:,0] += ds[that sample]
Jeśli Y[that sample] == 0
wtedy grad[:,0] -= (ds[that sample] * <Num of non zeros in M[that sample,:]>
)
Oto mój iteracyjne podejście:
for i in range(M.size(dim=1)):
for j in range(ds.size(dim=0)):
if y[j] == i:
grad[:,i] = grad[:,i] - (ds[j,:].T * sum(M[j,:]))
else:
if M[j,i] > 0:
grad[:,i] = grad[:,i] + ds[j,:].T