# -*- coding: utf-8 -*-
'''
Created on 2018年1月18日
@author: Jason.F
@summary: 特征抽取-KPCA方法,核主成分分析方法,RBF核实现,增加新样本映射功能KPCA基于内存,每次映射新样本,需要计算训练数据集中每一个样本和新样本之间的相似度(点积)
'''
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist,squareform
from scipy import exp
from scipy.linalg import eigh
from sklearn.datasets import make_moons
from sklearn.datasets import make_circles
from sklearn.decomposition import PCA
from matplotlib.ticker import FormatStrFormatter
from sklearn.gaussian_process.gpc import LAMBDAS
def rbf_kernel_pca(X,gama,n_components):'''RBF kernel PCA implementation.Parameters:X:{Numpy ndarray},shape=[n_samples,n_features]gama:float,Tuning parameter of the RBF kerneln_components:int,Number of principal components to returnReturns:X_pc:{Numpy ndarray},shape=[n_samples,n_features],Projected datasetlambdas:list,Eigenvalues'''#1:计算样本对欧几里得距离,并生成核矩阵#k(x,y)=exp(-gama *||x-y||^2),x和y表示样本,构建一个NXN的核矩阵,矩阵值是样本间的欧氏距离值。#1.1:calculate pairwise squared Euclidean distances in the MXN dimensional dataset.sq_dists = pdist (X, 'sqeuclidean') #计算两两样本间欧几里得距离#1.2:convert pairwise distances into a square matrix.mat_sq_dists=squareform(sq_dists) #距离平方#1.3:compute the symmetric kernel matrix.K=exp(-gama * mat_sq_dists) #2:聚集核矩阵K'=K-L*K-K*L + L*K*L,其中L是一个nXn的矩阵(和核矩阵K的维数相同,所有的值都是1/n。#聚集核矩阵的必要性是:样本经过标准化处理后,当在生成协方差矩阵并以非线性特征的组合替代点积时,所有特征的均值为0;但用低维点积计算时并没有精确计算新的高维特征空间,也无法确定新特征空间的中心在零点。#center the kernel matrix.N=K.shape[0]one_n = np.ones((N,N))/N #NXN单位矩阵K=K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)#3:对聚集后的核矩阵求取特征值和特征向量#obtaining eigenpairs from the centered kernel matrix#numpy.eigh returns them in sorted order.eigvals,eigvecs = eigh(K)#4:选择前k个特征值所对应的特征向量,和PCA不同,KPCA得到的K个特征,不是主成分轴,而是高维映射到低维后的低维特征数量#核化过程是低维映射到高维,pca是降维,经过核化后的维度已经不是原来的特征空间。#核化是低维映射到高维,但并不是在高维空间计算(非线性特征组合)而是在低维空间计算(点积),做到这点关键是核函数,核函数通过两个向量点积来度量向量间相似度,能在低维空间内近似计算出高维空间的非线性特征空间。#collect the top k eigenvectors (projected samples).X_pc = np.column_stack((eigvecs[:,-i] for i in range(1,n_components+1)))#collect the corresponding eigenvalues#保存特征值用于新样本映射lambdas = [eigvals[-i] for i in range(1,n_components+1)]return X_pc,lambdas#映射新样本,新样本和训练集中所有样本计算相似度,并生成新核矩阵
def project_x(x_new,X,gamma,X_kpca,lambdas):pair_dist = np.array([np.sum((x_new-row)**2) for row in X])k=np.exp(-gamma * pair_dist)return k.dot(X_kpca/lambdas) #新核矩阵映射的低维空间返回值#生成半月形数据,并映射到低维空间
X,y=make_moons(n_samples=100,random_state=123)
X_kpca,lambdas= rbf_kernel_pca (X,gama=15,n_components=1)#使用rbf+pca将样本映射到一维的子空间上
#新样本映射
x_new=X[25]#取数据集中的低26个样本作为新样本
print (x_new)
x_proj= X_kpca[25] #在训练集中映射的值
print (x_proj)
x_reproj=project_x(x_new,X,gamma=15,X_kpca=X_kpca,lambdas=lambdas)#新样本加入后映射的值
print (x_reproj)
#可视化效果
plt.scatter(X_kpca[y==0,0],np.zeros((50)),color='red',marker='^',alpha=0.5)
plt.scatter(X_kpca[y==1,0],np.zeros((50)),color='blue',marker='o',alpha=0.5)
plt.scatter(x_proj,0,color='black',label='original projection of point X[25]',marker='^',s=100)
plt.scatter(x_reproj,0,color='green',label='remapped point X[25]',marker='x',s=500)
plt.legend(scatterpoints=1)
plt.show()

结果:

【Python-ML】非线性映射降维-KPCA方法-新样本映射相关推荐

  1. 【Python-ML】非线性映射降维-KPCA方法

    # -*- coding: utf-8 -*- ''' Created on 2018年1月18日 @author: Jason.F @summary: 特征抽取-KPCA方法,核主成分分析方法,RB ...

  2. svd降维 python案例_PCA降维的原理、方法、以及python实现。

    PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...

  3. 数据分析学习总结笔记03:数据降维经典方法

    数据分析学习总结笔记03:数据降维经典方法 1. 数据降维概述 2. 数据降维的应用 3. 数据降维经典方法 3.1 主成分分析(PCA) 3.1.1 PCA概述 3.1.2 PCA原理 3.1.3 ...

  4. pca算法python代码_三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  5. @程序员:Python 3.8正式发布,重要新功能都在这里

    整理 | Jane.夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]最新版本的Python发布了!今年夏天,Python 3.8发布beta版本,但在2019年10月14日,第一个 ...

  6. 机器学习:python实现LDA降维算法

    这次,我们来学习一种经典的降维方法: 线性判别分析(Linear Discriminant Analysis, 以下简称LDA). 在前面博客中(点我)我们讲解了PCA降维算法. PCA追求的是在降维 ...

  7. Python专栏 | MNE数据预处理方法——独立成分分析

    关注微信公众号:脑机接口研习社 了解脑机接口最近进展 系列文章目录 Python专栏 | 脑电图和脑磁图(EEG/MEG)的数据分析方法之载入数据 Python专栏 | MNE脑电数据(EEG/MEG ...

  8. Python培训分享:Python新版本中的6个新特性

    Python在几年做了一个全面的升级,此次Python升级中有6个新特性,本期小编为大家介绍的Python培训教程就是关于介绍Python新版本中的6个新特性的,来看看下面的详细介绍. Python培 ...

  9. python使用imbalanced-learn的ClusterCentroids方法进行下采样处理数据不平衡问题

    python使用imbalanced-learn的ClusterCentroids方法进行下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜 ...

最新文章

  1. R语言使用ggpubr包的ggarrange函数组合多张结论图(水平并排组合)
  2. 佳能ts3100打印机使用说明书_佳能TS9120打印机完全满足家庭使用—最具性价比打印机...
  3. robotframework接口测试(二)—post request
  4. 数据库三范式经典实例解析
  5. MySQL中的事务日志
  6. C语言学习之用牛顿迭代法求下面方程在1.5附近的根: 2x³-4x²+3x-6=0
  7. Java中的锁(转)
  8. 随想录(keras入门)
  9. nginx配置多个域名_Nginx配置多个网站/项目的简单方式
  10. 程序员如何抓住工业互联网风口实现逆袭?
  11. android按任意建关闭对话框,Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭...
  12. 【跟着我们学Golang】基础结构
  13. 如何卸载红蜘蛛多媒体网络教室软件
  14. 图像处理中的数学原理归类
  15. 【仪器常用操作方法】33500B函数发生器常用操作方法
  16. 最全架构设计实践方法论(一)
  17. 对绝对地址0x100000赋值 让程序跳转到绝对地址是0x100000去执行
  18. win10系统重装之u盘装系统,u盘安装win10系统
  19. 随心玩玩(七)ELK日志系统配置部署
  20. Carson带你学Android:RxJava过滤操作符

热门文章

  1. Redis:主从复制原理
  2. 现代操作系统: 第一章 引言
  3. jmeter中控制器其中一个访问不到_Jmeter体系结构和运行原理
  4. javascript rsa java,用javascript与java执行 RSA加密与解密
  5. jtessboxeditorfx 界面显示不出来_鞋友疑问:奥莱的AJ1本来有完整盒子,为什么不愿意给我?...
  6. Kotlin exception
  7. 迷途の荣耀 Chapter Ⅱ
  8. 5、Linux-Mac配置环境变量
  9. 使用Pycharm创建一个Django项目
  10. 20145207 《Java程序设计》第5周学习总结