2017-02-08 9 views
2

страница https://pypi.python.org/pypi/fancyimpute имеет линиюНужна ли нормальная информация для fancyimpute's SoftImpute?

# Instead of solving the nuclear norm objective directly, instead 
# induce sparsity using singular value thresholding 
X_filled_softimpute = SoftImpute().complete(X_incomplete_normalized) 

, какой вид предполагает, что мне нужно нормализовать входные данные. Однако я не нашел никаких подробностей в Интернете, что именно подразумевается под этим. Должен ли я нормализовать свои данные заранее и что именно ожидается?

ответ

1

Да, вы должны обязательно нормализовать данные. Рассмотрим следующий пример:

from fancyimpute import SoftImpute 
import numpy as np 
v=np.random.normal(100,0.5,(5,3)) 
v[2,1:3]=np.nan 
v[0,0]=np.nan 
v[3,0]=np.nan 
SoftImpute().complete(v) 

В результате

array([[ 81.78428587, 99.69638878, 100.67626769], 
     [ 99.82026281, 100.09077899, 99.50273223], 
     [ 99.70946085, 70.98619873, 69.57668189], 
     [ 81.82898539, 99.66269922, 100.95263318], 
     [ 99.14285815, 100.10809651, 99.73870089]]) 

Обратите внимание, что места, где я ставлю nan полностью выключен. Однако, если вместо того, чтобы запустить

from fancyimpute import SoftImpute 
import numpy as np 
v=np.random.normal(0,1,(5,3)) 
v[2,1:3]=np.nan 
v[0,0]=np.nan 
v[3,0]=np.nan 
SoftImpute().complete(v) 

(тот же код, как и прежде, с той лишь разницей, что v нормализуется), вы получите следующий разумный результат:

array([[ 0.07705556, -0.53449412, -0.20081351], 
     [ 0.9709198 , -1.19890962, -0.25176222], 
     [ 0.41839224, -0.11786451, 0.03231515], 
     [ 0.21374759, -0.66986997, 0.78565414], 
     [ 0.30004524, 1.28055845, 0.58625942]]) 

Таким образом, когда вы используете SoftImpute, не забудьте нормализовать свои данные (вы можете сделать это, сделав среднее значение для каждого столбца равным 0, а std - 1).