lijun255sysu的个人博客分享 http://blog.sciencenet.cn/u/lijun255sysu

博文

Python_机器学习_总结11:降维压缩数据---核主成分法(非线性)

已有 2684 次阅读 2018-9-12 21:41 |系统分类:科研笔记

  • 核PCA:

    • 思路:是利用非线性映射将样本数据转换到更高维空间,然后再利用PCA将其映射到另一个低维空间;最后利用线性分类器对样本进行划分。

    • 缺点:计算成本很高;

    • 解决办法:使用核技巧;即在原始特征空间中计算两个高维特征空间中向量的相似度;


  • 常用的核函数有:

    • 多项式核:

            image.png    

    • 双曲正切和:

            image.png

    • 径向基核函数(Radial Basis Function, RBF),也称为高斯核函数:

                image.png

                或

                image.png

                


  • 基于RBF核的PCA计算步骤:

    • 计算核(相似)矩阵k

                image.png

    • 计算如下公式:

                image.png

    • 将K’的特征值按照降序排列,选择前k个特征值所对应的特征量;


================================================================

  • Example 01

    • 样本数据:          

                image.png

    • 使用标准PCA计算结果:--- 不可分

            image.png

    • 使用核PCA计算结果:---可分

            image.png

    • 代码如下:

#Example01
from scipy.spatial.distance import pdist, squareform
from scipy import exp
from scipy.linalg import eigh
import numpy as np

def rbf_kernel_pca(X, gamma, n_components):
    sq_dists = pdist(X, 'sqeuclidean')
    mat_sq_dists = squareform(sq_dists)
    K = exp(-gamma * mat_sq_dists)
    
    N = K.shape[0]
    one_n = np.ones((N,N))/N
    K = K - one_n.dot(K) -K.dot(one_n) + one_n.dot(K).dot(one_n)
    
    eigvals, eigvecs =eigh(K)
    
    X_pc = np.column_stack((eigvecs[:,-i] for i in range(1, n_components + 1)))
    
    return X_pc

####################################################################    
# Example 01
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
X, y = make_moons(n_samples=100, random_state=123)
plt.scatter(X[y==0, 0],X[y==0, 1], color='red', marker='^', alpha=0.5)
plt.scatter(X[y==1, 0],X[y==1, 1], color='red', marker='^', alpha=0.5)
plt.show()

# 使用标准PCA
from sklearn.decomposition import PCA
scikit_pca = PCA(n_components=2)
X_spca = scikit_pca.fit_transform(X)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3))
ax[0].scatter(X_spca[y==0,0], X_spca[y==0,1],color='red', marker='^', alpha=0.5)
ax[0].scatter(X_spca[y==1,0], X_spca[y==1,1],color='red', marker='^', alpha=0.5)
ax[1].scatter(X_spca[y==0,0], np.zeros((50,1))+0.02,color='red', marker='^', alpha=0.5)
ax[1].scatter(X_spca[y==1,0], np.zeros((50,1))-0.02,color='red', marker='^', alpha=0.5)
ax[0].set_xlabel('PC 1')
ax[0].set_ylabel('PC 2')
ax[1].set_ylim([-1,1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC 1')
plt.show()

#使用核PCA
from matplotlib.ticker import FormatStrFormatter
X_kpca = rbf_kernel_pca(X, gamma=15, n_components=2)
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(7,3))
ax[0].scatter(X_kpca[y==0,0], X_kpca[y==0,1],color='red', marker='^', alpha=0.5)
ax[0].scatter(X_kpca[y==1,0], X_kpca[y==1,1],color='red', marker='^', alpha=0.5)
ax[1].scatter(X_kpca[y==0,0], np.zeros((50,1))+0.02,color='red', marker='^', alpha=0.5)
ax[1].scatter(X_kpca[y==1,0], np.zeros((50,1))-0.02,color='red', marker='^', alpha=0.5)
ax[0].set_xlabel('PC 1')
ax[0].set_ylabel('PC 2')
ax[1].set_ylim([-1,1])
ax[1].set_yticks([])
ax[1].set_xlabel('PC 1')
plt.show()

#参考《Python 机器学习》,作者:Sebastian Raschaka, 机械工业出版社;



https://blog.sciencenet.cn/blog-3377553-1134451.html

上一篇:Python_机器学习_总结11:降维压缩数据---线性判别法(LDA)
下一篇:Python_机器学习_总结12:模型性能评估
收藏 IP: 183.17.232.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 11:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部