赞
踩
PCA算法,全程主成分分析法,是一种非监督的算法;主要用于数据的姜维,通过将为可以用较为简单的特征来代替原来的特征,在分类任务中可以使用PCA算法进行特征降维,然后减小计算量;
得到的奇异值分解的结果中,最大特征值对应的特征向量就是PCA得到的主方向,而且将所有的点映射到这个向量上得到到映射后的新点集方差最大,所以主方向可以最大程度保留数据的原始特性;
最小特征值对应的特征向量为法向量方向,法向量的起点为用于求奇异值分解点集的中心点;且法向量越大的点处曲率越小
3) 在求某点法向量的时候,需要确定该点的邻域半径,然后使用邻域内的点组成的点集来计算法法向量;半径选择太大,会受到不相关部分影响,导致法向量平滑;半径过小会容易受到噪声影响;半径不仅可以使用欧式空间邻域,同样可以使用其他尺度的邻域,包括反射率邻域,颜色邻域等;
import numpy as np
def PCA(data):
data_col = np.mean(data,axis = 0)
data = data - data_col
B = np.dot(data.T,data)#计算协方差矩阵
eigenvectors,eigenvalues, v = np.linalg.svd(B)#计算协方差矩阵的特征值和特征向量
sort = eigenvalues.argsort() #argsort返回列表从大到小排序之后在原始列表中的位置
eigenvalues = eigenvalues[sort]
eigenvectors = eigenvectors[:, sort]
return eigenvectors
def get_normals():
normals = []
radius = 0.05
leaf_size = 5
tree = KDTree(points,leaf_size)
near_point_idx = tree.query_radius(points,radius)#每一点的邻居点索引,包含自身点
for i in range(points.shape[0]):
point_near = points[near_point_idx[i]] #某一点的邻居点,
v = PCA(point_near)
normal = v[:,2]
normals.append(normal)
normals = np.asarray(normals)
如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高;
特征值分解有一些局限性,比如变换的矩阵必须是方阵;
在非高斯分布情况下,PCA方法得出的主元可能并不是最优的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。