Python-sklearn-降维 Sklearn 降维与流形学习sklearn.decomposition和sklearn.manifold提供 PCA、SVD、NMF、t-SNE 等降维工具。 矩阵分解1.PCA— 主成分分析 ⭐fromsklearn.decompositionimportPCA modelPCA(n_componentsNone,# 保留的成分数# int: 成分数# float (0~1): 保留的方差比例# mle: 自动选择Minkas MLE# None: 保留所有 min(n_samples, n_features)copyTrue,whitenFalse,# 白化处理svd_solverauto,# auto,full,arpack,randomizedtol0.0,# arpack 的容差iterated_powerauto,# randomized 的幂迭代次数n_oversamples10,# randomized 的过采样数random_stateNone,)model.fit(X)# 核心属性print(model.components_)# 主成分特征向量(n_components, n_features)print(model.explained_variance_)# 各成分的方差 ⭐print(model.explained_variance_ratio_)# 各成分的方差比例 ⭐print(model.singular_values_)# 奇异值print(model.mean_)# 训练数据的均值print(model.n_components_)# 实际成分数print(model.n_features_)# 特征数print(model.n_samples_)# 样本数print(model.noise_variance_)# 噪声方差# 变换X_pcamodel.transform(X)X_pcamodel.fit_transform(X)# 逆变换近似重建X_reconstructedmodel.inverse_transform(X_pca)# 增量 PCA大数据集pca.partial_fit(X_batch)# 不适用于普通 PCA2.IncrementalPCA— 增量 PCAfromsklearn.decompositionimportIncrementalPCA modelIncrementalPCA(n_componentsNone,whitenFalse,copyTrue,batch_sizeNone# 每批样本数)# 分批拟合forbatchinnp.array_split(X,10):model.partial_fit(batch)X_pcamodel.transform(X)3.KernelPCA— 核 PCAfromsklearn.decompositionimportKernelPCA modelKernelPCA(n_componentsNone,kernellinear,# linear,poly,rbf,sigmoid,cosine,precomputedgammaNone,# rbf/poly/sigmoid 的参数degree3,# poly 次数coef01,# poly/sigmoid 的独立项kernel_paramsNone,alpha1.0,# 学习到的逆变换正则化参数fit_inverse_transformFalse,eigen_solverauto,# auto,dense,arpack,randomizedtol0,max_iterNone,iterated_powerauto,remove_zero_eigFalse,random_stateNone,copy_XTrue,n_jobsNone)model.fit(X)X_kpcamodel.transform(X)# 逆变换需 fit_inverse_transformTrueX_reconstructedmodel.inverse_transform(X_kpca)4.SparsePCA/MiniBatchSparsePCA— 稀疏 PCAfromsklearn.decompositionimportSparsePCA,MiniBatchSparsePCA modelSparsePCA(n_componentsNone,alpha1,# 稀疏控制参数ridge_alpha0.01,# 岭惩罚max_iter1000,tol1e-8,methodlars,# lars 或 cd坐标下降n_jobsNone,random_stateNone)model.fit(X)print(model.components_)# MiniBatch 版本大数据modelMiniBatchSparsePCA(n_componentsNone,alpha1,batch_size100,random_state42)model.fit(X)5.TruncatedSVD— 截断 SVD ⭐不中心化数据直接进行 SVD 分解适合稀疏矩阵如 TF-IDF。fromsklearn.decompositionimportTruncatedSVD modelTruncatedSVD(n_components2,algorithmrandomized,# arpack 或 randomizedn_iter5,# 幂迭代次数randomizedn_oversamples10,random_stateNone,tol0.0)model.fit(X)print(model.components_)print(model.explained_variance_)print(model.explained_variance_ratio_)print(model.singular_values_)X_svdmodel.transform(X)X_approxmodel.inverse_transform(X_svd)6.NMF— 非负矩阵分解fromsklearn.decompositionimportNMF modelNMF(n_componentsNone,initNone,# random,nndsvd,nndsvda,nndsvdar,customsolvercd,# cd坐标下降或 mu乘法更新beta_lossfrobenius,# frobenius 或 kullback-leibler 或 floattol1e-4,max_iter200,random_stateNone,alpha_W0.0,# W 正则化alpha_Hsame,# H 正则化same 或 floatl1_ratio0.0,# L1/L2 比率0仅L2, 1仅L1shuffleFalse,# 按样本划分时的打乱顺序verbose0)model.fit(X)print(model.components_)# H 矩阵 (n_components, n_features)print(model.n_components_)print(model.reconstruction_err_)print(model.n_iter_)# W 矩阵样本在成分上的表示Wmodel.transform(X)X_approxmodel.inverse_transform(W)7.DictionaryLearning— 字典学习fromsklearn.decompositionimportDictionaryLearning modelDictionaryLearning(n_componentsNone,alpha1,# 稀疏控制max_iter1000,tol1e-8,fit_algorithmlars,# lars 或 cdtransform_algorithmomp,# lars,lasso_lars,lasso_cd,omp,thresholdtransform_n_nonzero_coefsNone,transform_alphaNone,n_jobsNone,code_initNone,dict_initNone,callbackNone,verboseFalse,random_stateNone)model.fit(X)print(model.components_)# 字典8.FactorAnalysis— 因子分析fromsklearn.decompositionimportFactorAnalysis modelFactorAnalysis(n_componentsNone,tol1e-2,copyTrue,max_iter1000,noise_variance_initNone,# 噪声方差初始值svd_methodrandomized,iterated_power3,rotationvarimax,# None 或 varimax正交旋转random_state0)model.fit(X)X_transformedmodel.transform(X)print(model.components_)print(model.noise_variance_)print(model.loglike_)9.FastICA— 独立成分分析ICAfromsklearn.decompositionimportFastICA modelFastICA(n_componentsNone,algorithmparallel,# parallel 或 deflationwhitenunit-variance,# unit-variance 或 True/Falsefunlogcosh,# logcosh,exp,cubefun_argsNone,# 函数参数max_iter200,tol1e-4,w_initNone,whiten_solversvd,random_stateNone)model.fit(X)print(model.components_)# 独立成分print(model.mixing_)# 混合矩阵print(model.mean_)# 各特征的均值print(model.n_iter_)# 迭代次数X_icamodel.transform(X)X_reconstructedmodel.inverse_transform(X_ica)10.LatentDirichletAllocation— LDA 主题模型fromsklearn.decompositionimportLatentDirichletAllocation modelLatentDirichletAllocation(n_components10,# 主题数doc_topic_priorNone,# Dirichlet 先验 αtopic_word_priorNone,# Dirichlet 先验 βlearning_methodbatch,# batch 或 onlinelearning_decay0.7,# online 学习率衰减learning_offset10.0,max_iter10,batch_size128,evaluate_every-1,# 每多少次迭代评估困惑度total_samples1e6,perp_tol1e-1,mean_change_tol1e-3,max_doc_update_iter100,n_jobsNone,verbose0,random_stateNone)model.fit(X)print(model.components_)# 主题-词矩阵 (n_topics, n_words)print(model.n_batch_iter_)# batch 方法的迭代次数print(model.bound_)# 变分下界# 文档-主题分布doc_topicsmodel.transform(X)# (n_docs, n_topics) 流形学习Manifold Learning1.TSNE— t-SNE ⭐fromsklearn.manifoldimportTSNE modelTSNE(n_components2,# 嵌入维度通常 2 或 3perplexity30.0,# 有效邻居数 (5-50)early_exaggeration12.0,# 早期放大因子learning_rateauto,# 学习率 (10-1000)automax(N/12, 200)n_iter1000,# 迭代优化次数n_iter_without_progress300,# 无改善则提前停止min_grad_norm1e-7,metriceuclidean,# 距离度量metric_paramsNone,initpca,# random,pca 或 ndarrayverbose0,random_stateNone,methodbarnes_hut,# barnes_hut 或 exactangle0.5,# barnes_hut 的角度-速度权衡n_jobsNone,perplexity_max_iter100# 1.3: perplexity 校准最大迭代)X_embeddedmodel.fit_transform(X)# 关键属性print(model.n_iter_)# 实际迭代数print(model.kl_divergence_)# 最终的 KL 散度print(model.embedding_)# 嵌入坐标print(model.learning_rate_)# 实际使用的学习率调参指导:# perplexity: 5-50数据集越大值越大# learning_rate: 10-1000# n_iter: 至少 250通常 1000-5000# 建议多次运行取最佳结果# 大规模数据集5000 样本先 PCA 降维再 t-SNEfromsklearn.pipelineimportmake_pipelinefromsklearn.decompositionimportPCA pipelinemake_pipeline(PCA(n_components50,random_state42),TSNE(n_components2,random_state42))X_embeddedpipeline.fit_transform(X)2.MDS— 多维缩放fromsklearn.manifoldimportMDS modelMDS(n_components2,metricTrue,# True度量 MDS, False非度量 MDSn_init4,# SMACOF 运行次数max_iter300,eps1e-3,# 收敛容差n_jobsNone,random_stateNone,dissimilarityeuclidean,# euclidean 或 precomputednormalized_stressauto# 是否返回标准化应力)X_embeddedmodel.fit_transform(X)print(model.stress_)# 应力值越低越好print(model.n_iter_)print(model.embedding_)3.Isomap— 等度量映射fromsklearn.manifoldimportIsomap modelIsomap(n_neighbors5,# 邻居数n_components2,eigen_solverauto,# auto,arpack,densetol0,max_iterNone,path_methodauto,# auto,FW(Floyd-Warshall),D(Dijkstra)neighbors_algorithmauto,# auto,brute,kd_tree,ball_treen_jobsNone,metricminkowski,p2,metric_paramsNone)X_embeddedmodel.fit_transform(X)print(model.embedding_)print(model.dist_matrix_)# 训练数据的全对最短路径距离print(model.nbrs_)# NearestNeighbors 实例print(model.kernel_pca_)# KernelPCA 实例print(model.n_features_in_)4.LocallyLinearEmbedding— 局部线性嵌入LLEfromsklearn.manifoldimportLocallyLinearEmbedding modelLocallyLinearEmbedding(n_neighbors5,n_components2,reg0.001,# 正则化常数eigen_solverauto,tol1e-6,max_iter100,methodstandard,# standard,hessian,modified,ltsahessian_tol0.0001,# Hessian LLE 的容差modified_tol1e-12,# Modified LLE 的容差neighbors_algorithmauto,random_stateNone,n_jobsNone)X_embeddedmodel.fit_transform(X)print(model.embedding_)print(model.reconstruction_error_)# 与 reconstruction error_ 相关联print(model.nbrs_)5.SpectralEmbedding— 谱嵌入fromsklearn.manifoldimportSpectralEmbedding modelSpectralEmbedding(n_components2,affinitynearest_neighbors,# nearest_neighbors,rbf,precomputed,callablegammaNone,# RBF 核参数random_stateNone,eigen_solverNone,# None,arpack,lobpcg,amgeigen_tolauto,n_neighborsNone,# nearest_neighbors 的邻居数n_jobsNone)X_embeddedmodel.fit_transform(X)print(model.embedding_)print(model.affinity_matrix_) PCA 实用技巧确定保留的方差importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.decompositionimportPCA pcaPCA().fit(X)# 累积方差比例cumsumnp.cumsum(pca.explained_variance_ratio_)# 找到 95% 方差所需的成分数n_95np.argmax(cumsum0.95)1print(fComponents for 95% variance:{n_95})# 可视化fig,(ax1,ax2)plt.subplots(1,2,figsize(14,5))# 碎石图ax1.bar(range(1,len(pca.explained_variance_ratio_)1),pca.explained_variance_ratio_)ax1.set_xlabel(Principal Component)ax1.set_ylabel(Explained Variance Ratio)# 累积方差ax2.plot(range(1,len(cumsum)1),cumsum,bo-)ax2.axhline(y0.95,colorr,linestyle--,label95%)ax2.axvline(xn_95,colorr,linestyle--)ax2.set_xlabel(Number of Components)ax2.set_ylabel(Cumulative Explained Variance)ax2.legend()plt.tight_layout()plt.show()PCA 逆变换重建pcaPCA(n_components0.95)# 只保留 95% 方差的成分X_reducedpca.fit_transform(X)X_reconstructedpca.inverse_transform(X_reduced)# 计算重建误差reconstruction_errornp.mean((X-X_reconstructed)**2) 算法选择指南场景推荐线性降维、去噪PCA稀疏数据如 TF-IDFTruncatedSVD非负数据NMF非线性可视化2D/3DTSNE保留全局结构MDS/Isomap保留局部结构LocallyLinearEmbedding独立源信号FastICA概率建模FactorAnalysis文本主题LatentDirichletAllocation大数据增量IncrementalPCA非线性 核方法KernelPCA稀疏表示SparsePCA/DictionaryLearning[[sklearn-总览|← 返回总览]]