快速入门Python机器学习(31)
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表示标签数。与原始维度无关 |
相关文章
- 快速入门Python机器学习(26)
- 快速入门Python机器学习(23)
- 快速入门Python机器学习(11)
- 快速入门Python机器学习(32)
- 超详细的80个Python入门实例,代码清晰拿来即用,学习提升必备「建议收藏」
- Python 学习笔记 列表 排序 xxx XXX
- 《深入浅出Python机器学习》读书笔记 第一章 概述
- 快速入门Python机器学习(九)
- 快速入门Python机器学习(34)
- 快速入门Python机器学习(25)
- 快速入门Python机器学习(28)
- Python 学习笔记 列表 xxx XXX
- 快速入门Python机器学习(21)
- 快速入门Python机器学习(30)
- 快速入门Python机器学习(13)
- 快速入门Python机器学习(18)
- 快速入门Python机器学习(15)
- 快速入门Python机器学习(27)
- Python学习笔记:几种排序算法
- 快速入门Python机器学习(十)