当前位置: 首页 > 知识库问答 >
问题:

如何访问此模型类中的数据?

鲍建业
2023-03-14

我使用包libmf来做并行非负矩阵分解,即X=WH。我使用类MF中的方法fi。如下面描述中所提到的,所得矩阵存储在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页面中,类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上。

共有1个答案

张和豫
2023-03-14

我对该库的了解不深,但这里有一些可能很有趣的观察结果:(基于提供的代码构建)

您可以使用引擎。q_factors;引擎。p_factors来获取P; Q矩阵,或者您可以遍历engine.model.P[i]

print(engine.p_factors())
# [[0.37909135 0.70226544]
#  [2.561905   2.0429273 ]
#  [1.7700745  2.0010414 ]]
print(engine.model.P[0:(engine.model.m * engine.model.k)])
# [0.37909135222435, 0.7022654414176941, 2.5619049072265625, 2.0429272651672363, 1.770074486732483, 2.0010414123535156]

对象engine有两种有趣的方法p\u因子;q_系数。在我们的设置中,这些方法产生两个(3,2)矩阵:

P = engine.p_factors()
P
# array([[0.37909135, 0.70226544],
#        [2.561905  , 2.0429273 ],
#        [1.7700745 , 2.0010414 ]], dtype=float32)
Q = engine.q_factors()
Q
# array([[0.87586826, 1.6112198 ],
#        [2.5359864 , 2.095469  ],
#        [1.6843219 , 2.0822709 ]], dtype=float32)

立即的反应是:让我们倍增!

RES = np.matmul(P, Q.transpose())
RES
# array([[ 1.463538 ,  2.432946 ,  2.1008186],
#        [ 5.535496 , 10.777846 ,  8.569    ],
#        [ 4.7744694,  8.682005 ,  7.1480856]], dtype=float32)

现在,我对库和主题的使用还不够深入,无法对该产品进行有根据的评估。

下一步是研究这两种方法p-q_因子。以下是源代码(MF.p_factors):

def p_factors(self):
    if self.model is None:
        return LookupError("no model data is saved, try running model.mf_fit(...) first")
    out = np.zeros(self.model.m * self.model.k)
    out = out.astype(np.float32)
    mf.get_P(ctypes.c_void_p(out.ctypes.data), ctypes.byref(self.model))
    return out.reshape((self.model.m, self.model.k))

这有点令人失望,因为似乎有趣的事情发生在mf中。获取\u P,其中mf是底层c库。

继续我们的探索,mf.get_P(libmf_interface.cpp)的源代码如下:

#ifdef __cplusplus
extern "C" float* get_P(float *out, mf::mf_model *model)
#else
float* get_P(float *out, mf::mf_model *model)
#endif
{
    for (int i = 0; i < model->m; i++){
        for(int j = 0; j < model->k; j++){
            int idx = i * model->k + j;
            out[idx] = model->P[idx];
        }
    }
    return out;
}

这段代码(非常)粗略地翻译为

def get_P(out, model: mf.MFMODEL) -> np.ndarray:
    for i in range(model.m):
        for j in range(model.k):
            idx = i * model.k + j
            out[idx] = model.P[idx]
    return out

它似乎从模型访问数据。P通过索引。

因此,您可以按如下方式访问数据引擎。模型P[i]

 类似资料:
  • 问题内容: 该模块为通用类型提示提供了一个基类:该类。 方括号中的接受类型参数的子类,例如: 我的问题是,如何访问这些类型参数? 也就是说,作为输入,我如何获得和输出? 基本上我正在寻找这样的功能 问题答案: Python 3.8更新 从Python3.8开始,有: PEP-560还提供了,它允许我们使用第 n 个通用基的参数: 旧答案 可能性1 从Python 3.6开始。有一个公共和()字段。

  • 我正在探索使用HandelbarsJS和主干的设置。 这是我的模板的一部分: 含义:我想呈现不同的图标,这取决于是否选择了模型。然而,我从来没有得到'图标V形下降',但总是'图标V形正确'的路径。你知道我遗漏了什么吗? 编辑 类型的选择在模型级工作,如下所示: 这可能会被简化,但我并没有从远程服务中获得类型的选择,但它只是用作临时状态更改。

  • 但是如果我不知道我想要获得的属性的名称怎么办?比方说,基于设计,模型由开发人员具有一些固定的属性,同时还有用户可以动态设置的特性。 因此,目前我使用并通过使用索引来访问由用户创建的属性,因为我知道我得到的列表将以模型的固定属性作为它的第一个元素,以索引0开头。但我发现这个解决方案不明确而且效率低。也有的时候,说我想工作,不适合。 例如: 每一次的帮助都将得到感激。

  • 我正在组装一个简单的购物车系统,使用Laravel和Vue.js,来出售照片。每张照片都有不同的尺寸,每个尺寸的价格都不同。 我有以下表格: 我正在使用Vue.js对我的购物车控制器进行API调用,以操纵购物车。当用户单击“添加到篮子”按钮时,它会传递照片id和大小id。当然,我想从数据库而不是客户端获取所选项目的价格,以防止任何无礼行为,这自然意味着查询pivot表。 我的问题是,使用传递给控制

  • 我正在研究的模型设置如下。它包含四种代理类型: 患者 小型医院 中级医院 大医院 . 所有这些代理都位于Main。SmallHospital和MediumHospital代理通过指向代理对象的链接在网络中连接到大医院,例如:和。 然而,我想在一段时间后将患者代理人转移到第二家医院。如果患者目前在小型医院,则应转移到小型医院链接到的mediumHospital,同样,如果患者在mediumHospi

  • 在web应用程序(基于laravel 5.3的mysql)中,有三个主要模型:、和和许多其他模型(、等)有管理器(另一个在顶层)。 属于。部门组成等级制度。用户有一些角色,例如,允许他查看他的部门和他的部门下面的所有部门的任务。 例如,零级部门的用户可以看到系统中的所有任务。