Прогнозирование пропущенных значений в Рекомендательной Системе
Я пытаюсь реализовать неотрицательную матричную факторизацию, чтобы найти пропущенные значения матрицы для проекта механизма рекомендаций. Я использую библиотеку nimfa для реализации факторизации матрицы. Но не могу понять, как предсказать пропущенные значения. Недостающие значения в этой матрице представлены 0.
a=[[ 1. 0.45643546 0. 0.1 0.10327956 0.0225877 ]
[ 0.15214515 1. 0.04811252 0.07607258 0.23570226 0.38271325]
[ 0. 0.14433757 1. 0.07905694 0. 0.42857143]
[ 0.1 0.22821773 0.07905694 1. 0. 0.27105237]
[ 0.06885304 0.47140452 0. 0. 1. 0.13608276]
[ 0.00903508 0.4592559 0.17142857 0.10842095 0.08164966 1. ]]
import nimfa
model = nimfa.Lsnmf(a, max_iter=100000,rank =4)
#fit the model
fit = model()
#get U and V matrices from fit
U = fit.basis()
V = fit.coef()
print numpy.dot(U,V)
Но данный ответ почти такой же, как и, и я не могу предсказать нулевые значения. Пожалуйста, скажите мне, какой метод использовать или какие-либо другие возможные реализации и любые возможные ресурсы.
Я хочу использовать эту функцию, чтобы минимизировать ошибку при прогнозировании значений.
ошибка = || а - УФ ||_F + c*||U||_F + c*||V||_F
где _F обозначает норму Фобениуса
1 ответ
Я раньше не использовал nimfa, поэтому не могу точно ответить, как это сделать, но с помощью sklearn вы можете выполнить препроцессор для преобразования отсутствующих значений, например так:
In [28]: import numpy as np
In [29]: from sklearn.preprocessing import Imputer
# prepare a numpy array
In [30]: a = np.array(a)
In [31]: a
Out[31]:
array([[ 1. , 0.45643546, 0. , 0.1 , 0.10327956,
0.0225877 ],
[ 0.15214515, 1. , 0.04811252, 0.07607258, 0.23570226,
0.38271325],
[ 0. , 0.14433757, 1. , 0.07905694, 0. ,
0.42857143],
[ 0.1 , 0.22821773, 0.07905694, 1. , 0. ,
0.27105237],
[ 0.06885304, 0.47140452, 0. , 0. , 1. ,
0.13608276],
[ 0.00903508, 0.4592559 , 0.17142857, 0.10842095, 0.08164966,
1. ]])
In [32]: pre = Imputer(missing_values=0, strategy='mean')
# transform missing_values as "0" using mean strategy
In [33]: pre.fit_transform(a)
Out[33]:
array([[ 1. , 0.45643546, 0.32464951, 0.1 , 0.10327956,
0.0225877 ],
[ 0.15214515, 1. , 0.04811252, 0.07607258, 0.23570226,
0.38271325],
[ 0.26600665, 0.14433757, 1. , 0.07905694, 0.35515787,
0.42857143],
[ 0.1 , 0.22821773, 0.07905694, 1. , 0.35515787,
0.27105237],
[ 0.06885304, 0.47140452, 0.32464951, 0.27271009, 1. ,
0.13608276],
[ 0.00903508, 0.4592559 , 0.17142857, 0.10842095, 0.08164966,
1. ]])
Вы можете прочитать больше здесь.