主成分分析(PCA)与LDA

主成分分析(PCA)

理论:

https://www.jianshu.com/p/4528aaa6dc48

http://blog.csdn.net/zhongkelee/article/details/44064401

代码:

# -*- coding:utf-8 -*-
# 导入需要的包:
import numpy as np
import matplotlib.pyplot as plt
# 数据生成
n = 50
x = np.random.normal(loc=1.0, scale=4.0, size=[n, 1])
y = 0.5*x + np.random.normal(loc=1, scale=1.0, size=[n, 1])

# Step 1: 连接x列y列
data = np.c_[x, y]
# 画个图看看分布情况:
plt.plot(data[:, 0], data[:, 1], 'o', color='red')
# Step 2: 求协方差矩阵(Covariance Matrix)
cov = np.cov(data.T)
# Step 3: 求协方差矩阵的特征根和特征向量
eig_val, eig_vec = np.linalg.eig(cov)
# 将特征向量加到我们原来的图里:(大小乘了10倍,方便看)
plt.plot([10*eig_vec[:, 0][0], 0], [10*eig_vec[:, 0][1], 0], color='orange')
plt.plot([10*eig_vec[:, 1][0], 0], [10*eig_vec[:, 1][1], 0], color='orange')
# 将数据直接乘以特征向量矩阵,那么其实我们只是以特征向量为基底,重新构建了空间
new_data = np.dot(data, eig_vec)
plt.plot(new_data[:, 0], new_data[:, 1], '.')
# Step 4: 选择主要成分
# 根据特征值的大小,从大到小的选择K个特征值对应的特征向量。
eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(len(eig_val))]
eig_pairs.sort(reverse=True)
# 从eig_pairs选取前k个特征向量就行。
# 这里,我们只有两个特征向量,选一个最大的。
feature = eig_pairs[0][1]
# Step 5: 转化得到降维的数据
new_data_reduced = np.transpose(np.dot(feature, np.transpose(data)))
# 通过画图来理解下数据经过PCA到底发生了什么。
plt.plot(new_data[:, 0], new_data[:, 1], '^', color='blue')
plt.plot(new_data_reduced[:], [y.max()+1]*n, '*', color='green')
# X,Y轴比例相同
plt.axis("equal")

PCA与LDA对比

# -*- coding:utf-8 -*-
# =======================================================
# Iris(花)数据集的LDA与PCA二维投影比较
# =======================================================
# Iris(花)数据集里面有3种鸢尾花(Setosa,Versicolour和 Virginica)
# 每种花都有4个属性:萼片长度,萼片宽度,花瓣长度,花瓣宽度。
#
# 主成分分析:Principal Component Analysis (PCA)
# 对这个数据集进行主成分分析,相当于寻找这个数据集的主成分,或特征空间中的方向。
# 这里用PCA后保留两个最大的特征方向。
#
# 线性判别分析(LDA)试图找到一个投影方向,这个投影方向能使类之间的差异最大。
# 与PCA相比,LDA是一种使用已知类标签的有监督方法。
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

iris = datasets.load_iris()

X = iris.data
y = iris.target
target_names = iris.target_names
# 使用PCA降到2维
# 建立一个PCA对象
pca = PCA(n_components=2)
# fit(X),表示用数据X来训练PCA模型。
# transform(X),将数据X转换成降维后的数据。
# fit_transform(X),用X来训练PCA模型,同时返回降维后的数据。
# X_r = pca.fit(X).transform(X) 或者:
X_r = pca.fit_transform(X)
# 建立一个LDA对象
lda = LinearDiscriminantAnalysis(n_components=2)
X_r2 = lda.fit(X, y).transform(X)

# 每个方向的方差所占百分比
print('方差占比(最大的两个分量): %s'
      % str(pca.explained_variance_ratio_))

plt.figure()
colors = ['red', 'green', 'blue']
lw = 2  # 点的大小
# zip() 函数将可迭代的对象作为参数
# 将对象中对应的元素打包成一个个元组
# 然后返回由这些元组组成的列表。
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=.8, lw=lw,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('IRIS数据集的PCA降维结果')
# loc:图例所有figure位置
# scatterpoints:散点图图例的标记点数(图例上显示多少个点)

plt.figure()
for color, i, target_name in zip(colors, [0, 1, 2], target_names):
    plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], alpha=.8, color=color,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('IRIS数据集的LDA降维结果')

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()

KPCA

https://blog.csdn.net/qq_39683748/article/details/84766150

你可能感兴趣的:(主成分分析(PCA)与LDA)