首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用非负矩阵分解求值

用非负矩阵分解求值
EN

Code Review用户
提问于 2015-07-13 00:36:57
回答 1查看 3.4K关注 0票数 5

X是一个DataFrame w/大约90%的缺失值和大约10%的实际值。我的目标是在连续的计算循环中使用nmf来预测我隐藏的实际值。掩码msk随机选择实际值的80% (或10%实际值的80% )。除了这80%到0之外,我初始化所有这些,并开始计算它们。第2行看起来很奇怪,因为我找不到一种方法来获得不属于np.nan的值的80% (训练集),所以如果我向一个数字添加一个np.nan,值将保持为np.nan。然后,如果我减去这个X.values,那么唯一受影响的值就是数组X_imputed的非空值。这允许我随机获得80%的非空值。

代码语言:javascript
复制
import pandas as pd
from pandas import DataFrame
import numpy as np

from sklearn.decomposition import ProjectedGradientNMF

# toy example data, actual data is ~500 by ~ 250
customers = range(20)
features = range(15)

toy_vals = np.random.random(20*15).reshape((20,15))
toy_mask = toy_vals < 0.9
toy_vals[toy_mask] = np.nan

X = DataFrame(toy_vals, index=customers, columns=features)
# end toy example data gen.

# imputation w/ nmf loops
X_imputed = X.copy()
msk = (X.values + np.random.randn(*X.shape) - X.values) < 0.8
X_imputed.values[~msk] = 0
nmf_model = ProjectedGradientNMF(n_components = 5)
W = nmf_model.fit_transform(X_imputed.values)
H = nmf_model.components_

while nmf_model.reconstruction_err_**2 > 10:
   nmf_model.fit_transform(X_imputed.values)
   W = nmf_model.fit_transform(X_imputed.values)
   H = nmf_model.components_
   X_imputed.values[~msk] = W.dot(H)[~msk]

我很确定这可以用较少的行来写,但我不知道怎么写。

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-07-14 16:58:57

  1. while循环中,您对nmf_model.fit_transform()的第一个调用是多余的,可以删除。您甚至没有使用转换计算的结果。下一行,您有W = nmf_model.fit_transform(X_imputed.values)的地方是做所有的工作。如果去掉这条线,那么模型的数量就会减半,而且速度会增加两倍。
  2. 您不需要在H循环外部/之前分配while
  3. 如果目标是最小化代码行,则可以避免将临时变量分配给临时变量,只需将用于定义变量的表达式放在使用它的代码行中即可。我在while循环中为H这样做了。它更紧凑,但可能更难理解。
  4. 您似乎不需要完整的pandas模块,这样就可以删除import
  5. 我没有在下面的代码中更改任何内容,但是为什么要对nmf_model.reconstruction_err_进行平方呢?根据docs的说法,这个误差是差分矩阵(X )的Frobenius范数,所以即使没有平方,它也永远是正的。

这一点更紧凑,而且速度更快(因为第1项):

代码语言:javascript
复制
from pandas import DataFrame
import numpy as np
from sklearn.decomposition import ProjectedGradientNMF

# Example data matrix X
nrows, ncols = 200, 150
toy_vals = np.random.random(nrows*ncols).reshape((nrows, ncols))
toy_vals[toy_vals < 0.9] = np.nan
X = DataFrame(toy_vals, index=range(nrows), columns=range(ncols))

# Hiding values to test imputation
X_imputed = X.copy()
msk = (X.values + np.random.randn(*X.shape) - X.values) < 0.8
X_imputed.values[~msk] = 0

# Initializing model
nmf_model = ProjectedGradientNMF(n_components=5)
nmf_model.fit(X_imputed.values)

# iterate model
while nmf_model.reconstruction_err_**2 > 10:
    W = nmf_model.fit_transform(X_imputed.values)
    X_imputed.values[~msk] = W.dot(nmf_model.components_)[~msk]
    print nmf_model.reconstruction_err_
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/96725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档