Python程序教程

您现在的位置是:首页 >  python学习

当前栏目

快速入门Python机器学习(31)

快速,入门,Python,机器,学习,31
2025-03-13 21:27:14 时间

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,)

参见 https://scikit-learn.org/stable/modules/generated/sklearn.discriminant_analysis.LinearDiscriminantAnalysis.html

方法

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表示标签数。与原始维度无关