Jac*_*son 1 python machine-learning pca scikit-learn linear-discriminant
我一直在测试PCA和LDA如何有效地分类我想要自动识别的3种不同类型的图像标签.在我的代码中,X是我的数据矩阵,其中每一行是图像中的像素,y是一维数组,表示每行的分类.
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.lda import LDA
pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)
plt.figure(figsize = (35, 20))
plt.scatter(X_r[:, 0], X_r[:, 1], c=y, s=200)
lda = LDA(n_components=2)
X_lda = lda.fit(X, y).transform(X)
plt.figure(figsize = (35, 20))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, s=200)
Run Code Online (Sandbox Code Playgroud)
使用LDA,我最终得到3个清晰可辨的聚类,它们之间只有轻微的重叠.现在,如果我有一个新图像我要分类,一旦我把它变成一维数组,我该如何预测它应该落入哪个集群,如果它离中心太远怎么能说这个分类是"不确定的" "?我也很好奇".transform(X)"函数在我适应它之后对我的数据做了什么.
在使用某些数据训练LDA模型后X
,您可能希望投影其他一些数据Z
.在这种情况下,你应该做的是:
lda = LDA(n_components=2) #creating a LDA object
lda = lda.fit(X, y) #learning the projection matrix
X_lda = lda.transform(X) #using the model to project X
# .... getting Z as test data....
Z = lda.transform(Z) #using the model to project Z
z_labels = lda.predict(Z) #gives you the predicted label for each sample
z_prob = lda.predict_proba(Z) #the probability of each sample to belong to each class
Run Code Online (Sandbox Code Playgroud)
请注意,'fit'用于拟合模型,而不是拟合数据.
因此transform
用于构建表示(在这种情况下为投影),并predict
用于预测每个样本的标签.(这用于从BaseEstimator
sklearn 继承的所有类.
您可以阅读文档以获取更多选项和属性.
此外,sklearn的API允许您pca.fit_transform(X)
而不是pca.fit(X).transform(X)
.在代码中的这一点之后,如果您对模型本身不感兴趣,请使用此版本.
一些评论:由于PCA是一种无监督的方法,LDA是一种更好的方法来进行您目前正在进行的"视觉"分类.
此外,如果您对分类感兴趣,您可以考虑使用不同类型的分类器,不一定是LDA,尽管它是一种很好的可视化方法.
归档时间: |
|
查看次数: |
13094 次 |
最近记录: |