12.3非负矩阵分解(NMF)
12.3.1 原理
非负矩阵分解(Non-Negative Matrix Factorization:NMF)
矩阵分解:一个矩阵A分解为A=B1×B2×…×Bn
非负矩阵分解:矩阵分解,矩阵A、 B1… Bn中元素均为非负
12.3.2类、参数、属性和方法
类
class sklearn.decomposition.NMF(n_components=None, *, init='warn', solver='cd', beta_loss='frobenius', tol=0.0001, max_iter=200, random_state=None, alpha=0.0, l1_ratio=0.0, verbose=0, shuffle=False, regularization='both')
属性
属性 |
类别 |
介绍 |
components_ |
ndarray of shape (n_components, n_features) |
因式分解矩阵,有时称为“字典”。 |
n_components_ |
int |
组件的数量。如果给定,则与nèu components参数相同。否则,它将与功能的数量相同。 |
reconstruction_err_ |
float |
拟合模型中训练数据X和重构数据WH之间的矩阵差的Frobenius范数,或beta散度。 |
n_iter_ |
int |
实际迭代次数。 |
方法
fit(X[, y]) |
学习数据X的NMF模型。 |
fit_transform(X[, y, W, H]) |
学习数据X的NMF模型并返回转换后的数据。 |
get_params([deep]) |
获取此估计器的参数。 |
inverse_transform(W) |
将数据转换回其原始空间。 |
set_params(**params) |
设置此估计器的参数。 |
transform(X) |
根据拟合的NMF模型变换数据X。 |
12.3.3散点图与热力分析
#降维NMF可视化 def dimension_reduction_for_nmf(mydata,title): myutil = util() X,y = mydata.data,mydata.target #由于是无监督学习,所以尽对X进行拟合 # 打印处理后的数据形态 print("处理后的数据形态:",X.shape) # 进行PCA处理 nmf = NMF(n_components=2,random_state=62,init='nndsvdar',max_iter=10000) #降到2类 nmf.fit(X) X_nmf = nmf.transform(X) # 打印主成分提取后的数据形态 print("非负矩阵分解后的数据形态:",X_nmf.shape) myutil.draw_scatter_for_Dimension_Reduction(X_nmf,mydata,title,'非负矩阵分解(NMF)') #使用主成分绘制热度图 myutil.draw_Heat_chart(nmf,mydata,title ,'非负矩阵分解(NMF)') def call_dimension_reduction_for_nmf(): mydatas = [datasets.load_iris(),datasets.load_wine(),datasets.load_breast_cancer()] titles = ["鸢尾花","红酒","乳腺癌"] for (mydata,title) in zip(mydatas,titles): dimension_reduction_for_nmf(mydata,title)
输出
处理后的数据形态: (150, 4) 非负矩阵分解后的数据形态: (150, 2) 处理后的数据形态: (178, 13) 非负矩阵分解后的数据形态: (178, 2) 处理后的数据形态: (569, 30) 非负矩阵分解后的数据形态: (569, 2)
12.3.4 案例——特征提取
from sklearn.decomposition import NMF def nmf_for_face(): faces = datasets.fetch_lfw_people(min_faces_per_person=20,resize=0.8) #用NMF模型进行模拟 X_train,X_test,y_train,y_test = train_test_split(faces.data/255,faces.target,random_state=62) mlp = MLPClassifier(hidden_layer_sizes=[100,100],random_state=62,max_iter=400) nmf = NMF(n_components=105,random_state=62).fit(X_train)#NMF中n_components不支持浮点数 X_train_nmf = nmf.transform(X_train) X_test_nmf = nmf.transform(X_test) print("NMF处理后数据形态:{}".format(X_train_nmf.shape)) #用神经网络模型进行训练 mlp.fit(X_train_nmf,y_train) print("NMF训练后模型识别准确率:{:.2%}".format(mlp.score(X_test_nmf,y_test)))
输出
NMF处理后数据形态:(2267, 105) NMF训练后模型识别准确率:56.22%
12.4线性判别分析(LDA)
12.4.1 原理
线性判别分析(Linear Discriminant Analysis: LDA)
有监督降维,寻找降维矩阵,投影后同类数据尽可能聚集在一起,不同类分开明显。
这点和PCA不同。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是"投影后类内方差最小,类间方差最大"
12.4.2类、参数、属性和方法
类
class sklearn.discriminant_analysis.LinearDiscriminantAnalysis(solver='svd', shrinkage=None, priors=None, n_components=None, store_covariance=False, tol=0.0001, covariance_estimator=None)
属性
属性 |
类别 |
介绍 |
solver |
{'svd', 'lsqr’, 'eigen'}, default='svd' |
'svd':奇异值分解(默认)。不计算协方差矩阵,因此对于具有大量要素的数据,建议使用此解算器。 'lsqr':最小二乘解。 可以结合收缩或自定义协方差估计。 'eigen':特征值分解。可以结合收缩或自定义协方差估计。 |
shrinkage |
'auto' or float, default=None |
收缩参数,可能值: None:无收缩(默认)。 'auto':使用莱德沃夫引理自动收缩。 浮动在0和1之间:固定收缩参数。 如果使用协方差估计器,这应该保留为无。请注意,收缩仅适用于'lsqr'和'eigen'解算器。 |
参数
参数 |
类型 |
coef_ |
ndarray of shape (n_features,) or (n_classes, n_features) |
intercept_ |
ndarray of shape (n_classes,) |
covariance_ |
array-like of shape (n_features, n_features) |
explained_variance_ratio_ |
ndarray of shape (n_components,) |
means_ |
array-like of shape (n_classes, n_features) |
priors_ |
array-like of shape (n_classes,) |
scalings_ |
array-like of shape (rank, n_classes - 1) |
xbar_ |
array-like of shape (n_features,) |
classes_ |
array-like of shape (n_classes,) |
方法
decision_function(X) |
将决策函数应用于一组样本。 |
fit(X, y) |
根据给定的拟合线性判别分析模型 |
fit_transform(X[, y]) |
适合数据,然后转换它。 |
get_params([deep]) |
获取此估计器的参数。 |
predict(X) |
预测X中样本的类标签。 |
predict_log_proba(X) |
估计对数概率。 |
predict_proba(X) |
估计概率。 |
score(X, y[, sample_weight]) |
返回给定测试数据和标签的平均准确度。 |
set_params(**params) |
设置此估计器的参数。 |
transform(X) |
项目数据最大化类分离。 |
12.4.3散点图与热力分析
#线性判别分析 def dimension_reduction_for_lda(mydata,title): myutil = util() X,y = mydata.data,mydata.target print("处理后的数据形态:",X.shape) # 进行PCA处理 lda = LinearDiscriminantAnalysis(n_components=2) lda.fit(X,y) X_lda = lda.transform(X) # 打印主成分提取后的数据形态 print("非负矩阵分解后的数据形态:",X_lda.shape) myutil.draw_scatter_for_Dimension_Reduction(X_lda,mydata,title,'线性判别分析(LDA)') def call_dimension_reduction_for_lda(): mydatas = [datasets.load_iris(),datasets.load_wine(),datasets.load_breast_cancer()] titles = ["鸢尾花","红酒"] for (mydata,title) in zip(mydatas,titles): dimension_reduction_for_lda(mydata,title)
输出
处理后的数据形态: (150, 4) 非负矩阵分解后的数据形态: (150, 2) 处理后的数据形态: (178, 13) 非负矩阵分解后的数据形态: (178, 2) 处理后的数据形态: (569, 30) 非负矩阵分解后的数据形态: (569, 2)
12.5降维总结
12.5.1鸢尾花
12.5.2红酒
12.5.3乳腺癌
12.5.4 PCA VS LDA
思考方向 |
PCA |
LDA |
思想 |
从协方差角度出发 |
从分类标签角度出发 |
学习模型 |
无监督 |
有监督 |
降维后可用维度 |
最大可选择全部维度 |
C-1维,C表示标签数。与原始维度无关 |