数据的标准化和正态化变换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据的标准化和正态化变换相关的知识,希望对你有一定的参考价值。

参考技术A 数据挖掘过程中,不同变量数据单位不一,比如,我们想知道一个人身体健康状况,其身高是180cm,体重是80kg,视力是2.5,心跳是70/min,这些指标都是描述一个人身体状况的数据,这些单一不一的指标会对建模的准确度有一定影响。因此,在数据挖掘之前,我们要对数据做标准化处理。
另外,建模之后,我们产生了有价值的目标变量数据,但是这些数据都是标准化数据形式,跟实际业务问题的需求有一定偏差。如此,需要对数据做一定的变换,比如使其接近正态分布,这样从数据形式上可以对业务问题有更好的解释。

数据标准化有很多形式,这里简单总结三种,如下:

假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。z_score规范化如下:
x(i,j)' = [x(i,j) - E(j)] / S[j] ,即x(i,j)减去第j列的均值再除以第j列的标准差。
这样处理之后,原数据就变成了均值为0,方差为1,记作:
X' = [X - E(X)] / S(X) ,其中,E(X) = 0, S(X) = 1。

假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。中心化如下:
x(i,j)' = x(i,j) - E(j) ,E(j)是第j列的均值。
如此变化以后,均值为0,但是方差矩阵不变。

假设我们有一个X向量,x(i,j),i = 1,..,m;j = 1,..,n。极差标准化如下:
x(i,j) = [x(i,j) - E(j)]/ ( max(j) - min(j) .
这样变换后,均值为0,方差为1.

小数定标规范化通过移动数据A的小数点位置进行规范化。小数点的移动位置依赖数据A的最大值。由下式计算:|max(A)|<1的最小整数。假设A的取值为-986 ~ 917,A的最大绝对值为986,使用小数定标规范化,用1000除以每个值,这样-986标准化为-0.986,917则为0.917.

注意:极差标准化和小数定标规范化都改变了原数据,如果想统一转换为原数据比较麻烦。所以可以尽量通过前两种方法来做规范化。

R语言中有现成的函数,比如scale,可以通过设置scale的参数来实现z_score和中心化的数据标准化,具体参考?scale.
当然,可以可以自己写一个规范化函数,如下:

数据正态化,目的是稳定方差,直线化,使数据分布正态或者接近正态。
如果y = f(x) 是x的线性函数,不影响分析;但是如果是非线性函数,y和x的表现就完全不同,包括分布,方差和数据间关系也会不同。

这个不做过多解释,请参考 这里

Box-Cox在1964年从实际数据出发提出了一个很有效的变换,如下:
y = ifelse(k = 0,log(y),[y^k-1]/k) ,此变换有如下特点:

实际应用中,Box-Cox还有个扩展式,如下:
y = ifelse(k1 = 0,log(y+k2),[(y +k2)^k1-1]/k1) ,任意y,保证y+k2>0,即k2已知,k1为参数。

请参考这个文章, Box-Cox Transformation

1, Box-Cox Transform: An Overview
2, Box-Cox变换
3, 统计学与R语言笔记-徐俊晓

使用 PCL 进行点云下采样和正态估计

【中文标题】使用 PCL 进行点云下采样和正态估计【英文标题】:Point cloud Downsampling and normal estimation with PCL 【发布时间】:2019-09-03 10:29:47 【问题描述】:

我正在研究下采样点云和法线估计。正常的估计对我来说很好,也可以进行下采样;但是,当它们结合在一起时,它们不起作用,我收到以下信息: (核心转储)。下面是我的代码。任何帮助表示赞赏?

pcl::PCLPointCloud2 pcl_pc2;
pcl::PointCloud<pcl::PointXYZ>::Ptr temp_cloud2(new    pcl::PointCloud<pcl::PointXYZ>);

pcl_conversions::toPCL(*input,pcl_pc2);

pcl::PointCloud<pcl::PointXYZ>::Ptr temp_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromPCLPointCloud2(pcl_pc2,*temp_cloud);

// Perform the actual filtering
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud (temp_cloud);
sor.setLeafSize (0.1f, 0.1f, 0.1f);
sor.filter (*temp_cloud2); 

//do stuff with temp_cloud here
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud (temp_cloud2);

// Create an empty kdtree representation, and pass it to the normal estimation object.
// Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
ne.setSearchMethod (tree);

// Output datasets
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

// Use all neighbors in a sphere of radius 3cm
ne.setRadiusSearch (0.03);

// Compute the features
ne.compute (*cloud_normals);

【问题讨论】:

【参考方案1】:

这对我来说已经解决了;我已将搜索半径从0.03 更改为0.3,因为在0.03,由于下采样,没有点云数据。

【讨论】:

以上是关于数据的标准化和正态化变换的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用scale函数对数据进行标准化(标准正态化)计算数据的行平均值(row means)cbind函数纵向拼接到原dataframe中使用quantile函数计算分位数(2,4,6,8)

R语言使用scale函数对数据进行标准化(标准正态化)计算数据的行平均值(row means)cbind函数纵向拼接到原dataframe中使用quantile函数计算分位数(2,4,6,8)

机器学习基础 - 偏度正态化以及 Box-Cox 变换

ALINK(二十):数据处理数值型数据处理标准化 (StandardScalerPredictBatchOp/StandardScalerTrainBatchOp )

为啥进行python标准化

点云配准 6 -pcl如何使用正态分布变换进行配准