【发布时间】:2022-01-17 01:20:04
【问题描述】:
我正在使用包 libmf 进行并行非负矩阵分解,即 X = WH。我使用MF 类中的方法fit。如下文所述,生成的矩阵存储在MF.model。
def fit(self, X):
"""
factorize the i x j data matrix X into (j, k) (k, i) sized matrices stored in MF.model
:param X: (n, 3) shaped numpy array [known index and values of the data matrix]
"""
ensure_width(X, 3)
d = X.astype(np.float32)
data_p = d.ctypes.data_as(c_float_p)
nnx = ctypes.c_int(X.shape[0])
mf.fit_interface.restype = ctypes.POINTER(MFModel)
mf.fit_interface.argtypes = (ctypes.c_int, c_float_p, options_ptr)
out = mf.fit_interface(nnx, data_p, self._options)
self.model = out.contents
从包的GitHub page来看,类MFModel是
class MFModel(ctypes.Structure):
_fields_ = [("fun", ctypes.c_int),
("m", ctypes.c_int),
("n", ctypes.c_int),
("k", ctypes.c_int),
("b", ctypes.c_float),
("P", c_float_p),
("Q", c_float_p)]
您能解释一下如何从这个类中提取信息吗?
# !pip install libmf
import numpy as np
from libmf import mf
X = np.array([[1, 2, 3],
[0, 11, 0],
[5, 0, 7]])
row, col = X.nonzero()
values = X[np.nonzero(X)]
res = np.array(list(zip(row.tolist(), col.tolist(), values.tolist())))
engine = mf.MF(k = 2)
engine.fit(res)
engine.model
为了方便,我也把笔记本放在了 Colab here。
【问题讨论】:
-
model.P和model.Q是指向浮点数组P和Q的指针 -
@Marat 如果我使用
engine.model.P而不是engine.model,我得到<libmf.mf.LP_c_float at 0x7ff8351fa950>。您能解释一下如何在通常的 numpy 数组中获取P和Q吗?
标签: python c numpy python-class