numpy 中的降维与升维
升维(Dimensionality Augmentation):增加数据的维度,通常用于提供更多信息或从不同的角度看待数据。
降维(Dimensionality Reduction):减少数据的维度,通常用于简化数据或去除无关紧要的特征。
降维
最近在飞桨学习机器学习的时候发现一个概念让人摸不清头脑,计算梯度的时候使用了 np.mean 来进行降维。
z = net.forward(x)
gradient_w=(z-y)* x
gradient_w=np.mean(gradient_w,axis=0)
gradient_w= gradient_w[:,np.newaxis]
gradient_b=(z-y)
gradient_b=np.mean(gradient_b)
#此处b是一个数值,所以可以直接用np.mean得到一个标量
gradient_b
142.50289323156107
numpy数组的维度(13,)和(13,1)的主要区别在于它们的维度和表示的数据结构。
当一个numpy数组的维度为(13,),它表示这是一个一维数组,只有一个索引维度,即数据只能通过一个单一的索引来进行访问。这种形状的数组通常用于表示一维的数据序列,如时间序列数据或简单的数值列表。在这种情况下,数组中的每个元素都可以通过一个单一的索引(从0到12)来访问。
相比之下,维度为(13,1)的数组是一个二维数组,但它只有一列。这种形状的数组在numpy中通常用于表示行向量,即它有一个行索引维度和一个列索引维度,尽管列维度只包含一个元素。这种形状的数组在数学和科学计算中特别有用,因为它允许对数据进行矩阵操作,即使这些矩阵实际上只有一行或一列。例如,一个(13,1)的数组可以看作是一个包含13个元素的列向量,每个元素都可以通过两个索引(一行和一列)来访问。
在这里要有个认识是这个公式:
或者有些公式在这个地方放的是 2N
mean 实际上是加和平均数。所以说不可被概念蒙蔽了双眼,机器学习的代码大多是基于理论,不像web 基于逻辑随便解释。
为什么降维?
1、随着数据维度不断降低,数据存储所需的空间也会随之减少。
2、低维数据有助于减少计算/训练用时。
3、一些算法在高维度数据上容易表现不佳,降维可提高算法可用性。
4、降维可以用删除冗余特征解决多重共线性问题。比如我们有两个变量:“一段时间内在跑步机上的耗时”和“卡路里消耗量”。这两个变量高度相关,在跑步机上花的时间越长,燃烧的卡路里自然就越多。因此,同时存储这两个数据意义不大,只需一个就够了。
5、降维有助于数据可视化。如果数据维度很高,可视化会变得相当困难,而绘制二维三维数据的图表非常简单。
减少数据的维度,通常用于简化数据或去除无关紧要的特征。
数组的降维
- array.ravel()
- np.squeeze(array)
- array.reshape(-1)
- array.flatten():返回源数据的副本
升维
增加数据的维度,通常用于提供更多信息或从不同的角度看待数据。
数组的升维
- np.atleast_2d(array) 转为二维数组
- np.atleast_3d(array) 转为三维数组
- array[:,np.newaxis] 升维一次 n行一列
- array[np.newaxis,:] 升维一次 一行n列
- array.reshape(-1,1) 变成n行一列
- array.reshape(1,-1) 变成一行n列
- np.expand_dims(a, axis)
参考:
https://www.jb51.net/python/3024442as.htm
https://huaweicloud.csdn.net/6380889adacf622b8df89aba.html