PCA:主成分分析
LDA:线性判别分析
PCA与LDA的异同点:
相同点:
两者都可对数据完成降维操作
两者在降维时都使用了矩阵分解的思想
两者都假设数据服从高斯分布(正态分布)
不同点:
LDA是监督学习;PCA是无监督学习
LDA除了降维外,还可以用于分类
LDA使得类内距离小,类间距离大;PCA去除原始数据中冗余的特征,使得投影在各个维度的方差尽可能大
LDA关注分类能力,不保证投影到的坐标系是正交的;PCA投影的坐标系都是正交的
PCA降维
# pca
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_blobs
from sklearn.decomposition import PCA
import warnings
warnings.filterwarnings('ignore')
# x为样本特征,每个样本3个特征,y为样本簇类别,共4个簇, 共1000个样本
x, y = make_blobs(n_samples=1000, n_features=3, centers=[[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]], cluster_std=[0.2, 0.2, 0.2, 0.2],
random_state =8)
fig = plt.figure()
ax = Axes3D(fig)
plt.scatter(x[:, 0], x[:, 1], x[:, 2], marker='o')
plt.show()
x_pca = PCA(n_components=2).fit_transform(x)
plt.scatter(x_pca[:, 0], x_pca[:, 1])
plt.show()
# lda
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_classification
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import warnings
warnings.filterwarnings('ignore')
# x为样本特征,每个样本3个特征,y为样本类别,共3个类别, 共1000个样本
x, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,
n_clusters_per_class=1, class_sep =0.5, random_state =2)
fig = plt.figure()
ax = Axes3D(fig)
plt.scatter(x[:, 0], x[:, 1], x[:, 2], marker='o', c=y)
plt.show()
lda = LinearDiscriminantAnalysis(n_components=2).fit(x, y)
x_lda = lda.transform(x)
plt.scatter(x_lda[:, 0], x_lda[:, 1], c=y)
plt.show()