# -*- 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. 计算机视觉形态学之膨胀、腐蚀、开运算、闭运算、顶帽、黑帽和形态学梯度
  2. vue 多个click_vue中touch和click共存的解决方式
  3. 第十一章 “她”值多少钱
  4. 对于指针与malloc函数关系的研究,以及指针的赋值。
  5. P2619 [国家集训队]Tree I(WQS二分/带权二分/最小生成树)
  6. python数据结构与算法分析_数据结构和算法分析
  7. 计算机组成原理 mov(r0),-(sp),第三章作业
  8. 拼多多:不搞套路,要实现同品全网最低价直售
  9. 分数四则运算法则c语言,△【OJ】(二)---C---分数类的四则运算
  10. jsp大作业_Servlet与JSP配合使用基本案例
  11. 05NumPy--5.4随机数
  12. 中国主流的大数据分析厂商
  13. 测试总结(部分)---转载
  14. Java编程:排序算法
  15. day02 python基础
  16. 补充STM32 PWM占空比,频率的计算及输入捕获细节到STM32库函数的掌握方法
  17. 计算机连接拒绝访问,打印机拒绝访问,手把手教你打印机拒绝访问无法连接
  18. Redhat 8修改系统语言为英文
  19. 176. 第二高的薪水(SQL中的ifnull函数和limt1,1的使用)
  20. java 红绿灯_java -- GUI 红绿灯

热门文章

  1. NIO详解(十一):线程间通信管道Pipe
  2. Zookeeper分布式一致性原理(一):分布式架构
  3. Linux cat 命令
  4. Harvard's CS50
  5. TCP三次握手原理,你真的了解吗?
  6. switch-case和if-else可互换时
  7. Python 09--多线程、进程
  8. 关于UC、火狐、谷歌浏览器屏蔽布局中广告的解决办法
  9. [Objective-c 基础 - 2.10] description方法
  10. Android笔记之FragmentTabHost实现选项卡