非负矩阵分解
简单来说,就是一个数据矩阵X,也可以理解为特征矩阵,将这个矩阵分解为两个非负矩阵W和H的乘积。
公式可以写成下面:
这里的m和n就是特征的维度,r表示代码中n_components
参数
来看个例子:
看看鸢尾花
from sklearn.decomposition import NMF
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import mean_absolute_error
data = load_iris()
X = data['data']
y = data['target']
nmf = NMF(n_components=2, # k value,默认会保留全部特征
init=None, # W H 的初始化方法,包括'random' | 'nndsvd'(默认) | 'nndsvda' | 'nndsvdar' | 'custom'.
solver='cd', # 'cd' | 'mu'
beta_loss='frobenius', # {'frobenius', 'kullback-leibler', 'itakura-saito'},一般默认就好
tol=1e-4, # 停止迭代的极限条件
max_iter=200, # 最大迭代次数
random_state=None,
l1_ratio=0., # 正则化参数
verbose=0, # 冗长模式
shuffle=False # 针对"cd solver"
)
print('params:', nmf.get_params()) # 获取构造函数参数的值,也可以nmf.attr得到,所以下面我会省略这些属性
# 训练模型并转换数据
W = nmf.fit_transform(X)
H = nmf.components_
# 使用KMeans进行聚类,得到预测标签
kmeans = KMeans(n_clusters=3, random_state=0)
y_pred = kmeans.fit_predict(W)
# 计算MAE
mae = mean_absolute_error(y, y_pred)
print("MAE:", mae)
# 打印其他属性信息
print('reconstruction_err_', nmf.reconstruction_err_) # 损失函数值
print('n_iter_', nmf.n_iter_) # 实际迭代次数
# MAE: 0.04666666666666667
主要是使用NMF降维,设置n_components=2
,降维后再使用kmeans聚类预测,得到MAE误差是0.05,比直接对X预测误差要低。