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%的非空值。
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]我很确定这可以用较少的行来写,但我不知道怎么写。
发布于 2015-07-14 16:58:57
while循环中,您对nmf_model.fit_transform()的第一个调用是多余的,可以删除。您甚至没有使用转换计算的结果。下一行,您有W = nmf_model.fit_transform(X_imputed.values)的地方是做所有的工作。如果去掉这条线,那么模型的数量就会减半,而且速度会增加两倍。H循环外部/之前分配while。H这样做了。它更紧凑,但可能更难理解。pandas模块,这样就可以删除import。nmf_model.reconstruction_err_进行平方呢?根据docs的说法,这个误差是差分矩阵(X )的Frobenius范数,所以即使没有平方,它也永远是正的。这一点更紧凑,而且速度更快(因为第1项):
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_https://codereview.stackexchange.com/questions/96725
复制相似问题