KPCA算法+python实现
KPCA核心:用核函数将数据实现非线性映射,然后再使用PCA进行降维核函数有很多,这里选择常用的高斯核函数:得到K之后需要对K进行中心化处理:得到之后对K'求出其特征向量和特征值,将特征向量和特征值从大到小排序,根据参数选择的主成分来裁切部分。与PCA不同的是,得出的特征向量并不是投影的坐标轴,而是投影出来的坐标。参考代码如下:def rbf_kernel_pca(X,gammas,compone
·
KPCA核心:用核函数将数据实现非线性映射,然后再使用PCA进行降维
核函数有很多,这里选择常用的高斯核函数:
得到K之后需要对K进行中心化处理:
得到之后对K'求出其特征向量和特征值,将特征向量和特征值从大到小排序,根据参数选择的主成分来裁切部分。与PCA不同的是,得出的特征向量并不是投影的坐标轴,而是投影出来的坐标。
参考代码如下:
def rbf_kernel_pca(X,gammas,components):
#计算欧式距离的平方
sq_dist = pdist(X, 'sqeuclidean')
mat_sq_dists = squareform(sq_dist)
#计算K
K = np.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)
#eigh可以对特征值进行排序,但是eigh适用于对称矩阵
eigvals,eigvecs = np.linalg.eigh(K)
eigvals,eigvecs = eigvals[::-1],eigvecs[:,::-1]
#选取特征向量和特征值
alphas = np.column_stack([eigvecs[:, i] for i in range(components)])
lambdas = [eigvals[i] for i in range(components)]
#返回alphas为降维后的投影坐标,lamdbas为对新数据进行投影的特征向量
return alphas, lambdas
更多推荐
已为社区贡献1条内容
所有评论(0)