浅入浅出:PageRank算法 使用 TextRank 算法为文本生成关键字和摘要 基于物品的协同过滤 如何使用MapReduce实现基于物品的协同过滤(1) 如何使用MapReduce实现基于物品的协同过滤(2) 浅入浅出:K近邻算法 使用mahout下的朴素贝叶斯分类器对新闻分类 使用Affinity Propagation进行聚类 K-medoids聚类 矩阵分解在推荐系统中的应用:NMF和经典SVD实战 使用特征递归消除筛选特征 如何分配权重 比较NMF、PCA和VQ 方差和协方差 基于SVD的协同过滤 逻辑斯谛回归代码实现 隐语义模型和NMF(非负矩阵分解) 使用PCA处理MNIST数据集 使用GBDT选取特征 基于贝叶斯的文本分类系统的数据库设计 在hadoop1.2.1上安装mahout 0.9 Hadoop 2.4 实现Kmeans聚类算法 在Iris数据集上对比PCA、LDA、NMF 基于贝叶斯的文本分类实战 单层决策树 Logistic regression(逻辑斯蒂回归) 基于用户的协同过滤 词袋模型与文档-词矩阵 如何实现拼音与汉字的互相转换 梯度下降法 如何判定相似度 MovieLens数据集介绍 基于KNN的文本分类实战 Jasper文本分类系列博客阅读摘录 使用 Mean Shift进行聚类 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 使用决策树处理iris数据集 浅入浅出:从Kmeans到Kmeans++ 如何持久化scikit-learn中训练好的模型 浅入浅出:DBSCAN聚类算法(1) 浅入浅出:DBSCAN聚类算法(2) 2015阿里移动推荐算法比赛第一赛季总结 爬山算法 使用朴素贝叶斯分类器划分邮件 层次聚类 基于MapReduce的频繁项集挖掘 搜狗实体关系提取比赛

在Iris数据集上对比PCA、LDA、NMF


#机器学习


2015-04-03

PCA、LDA、NMF都可以用来降维。

之前在 使用PCA处理MNIST数据集 介绍过PCA,在 隐语义模型和NMF(非负矩阵分解) 介绍过NMF。

这里的LDA,是指线性判别分析(Linear Discriminant Analysis),是一种有监督的学习方法。这方面的资料可以参考:

PRML(Pattern Recognition and Machine Learning)第四章

机器学习中的数学(4)-线性判别分析(LDA), 主成分分析(PCA)

线性判别分析(Linear Discriminant Analysis)(一)

本文内容是如何使用scikit-learn中的这3个降维工具处理Iris数据集,并用图的形式比较了降维效果。

导入数据集

>>> from sklearn.datasets import load_iris
>>> import numpy as np
>>> iris = load_iris()
>>> iris.data
array([[ 5.1,  3.5,  1.4,  0.2],  
       [ 4.9,  3. ,  1.4,  0.2],
       ....
       [ 5.9,  3. ,  5.1,  1.8]])
>>> iris.target
array([0, 0, 0, 0, 0, 0, ... , 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
>>> iris.data.shape  
(150, 4)                   # 150个样本,每个样本4个特征
>>> iris.target.shape      # 每个样本的类别
(150,)

PCA

>>> from sklearn.decomposition import PCA
>>> pca = PCA(n_components=2)
>>> pca_result = pca.fit_transform(iris.data)

LDA

>>> from sklearn.lda import LDA
>>> lda = LDA()
>>> lda = LDA(n_components=2)
>>> lda_result = lda.fit_transform(iris.data, iris.target)

NMF

>>> from sklearn.decomposition import NMF
>>> nmf = NMF(n_components=2)
>>> nmf_result = nmf.fit_transform(iris.data)

画图

>>> import matplotlib.pyplot as plt
# for PCA
>>> plt.subplot(1,3,1)
>>> plt.scatter(pca_result[iris.target==0, 0], pca_result[iris.target==0, 1], color='r')
>>> plt.scatter(pca_result[iris.target==1, 0], pca_result[iris.target==1, 1], color='g') 
>>> plt.scatter(pca_result[iris.target==2, 0], pca_result[iris.target==2, 1], color='b') 
>>> plt.title('PCA on iris')

# for LDA
>>> plt.subplot(1,3,2)
>>> plt.scatter(lda_result[iris.target==0, 0], lda_result[iris.target==0, 1], color='r')
>>> plt.scatter(lda_result[iris.target==1, 0], lda_result[iris.target==1, 1], color='g') 
>>> plt.scatter(lda_result[iris.target==2, 0], lda_result[iris.target==2, 1], color='b') 
>>> plt.title('LDA on iris')

# for NMF
>>> plt.subplot(1,3,3)
>>> plt.scatter(nmf_result[iris.target==0, 0], nmf_result[iris.target==0, 1], color='r')
>>> plt.scatter(nmf_result[iris.target==1, 0], nmf_result[iris.target==1, 1], color='g') 
>>> plt.scatter(nmf_result[iris.target==2, 0], nmf_result[iris.target==2, 1], color='b') 
>>> plt.title('NMF on iris')

>>> plt.show()

查看效果

每副图中的灰色直线是我添加上去的,这些直线可以看出新数据的不同特点。



( 本文完 )