1. 图像数据转结构化数据
在机器学习中,图像的结构一般是(RGB)三个通道的,每个通道包括了它的(nrows, ncols).对应图像的长(行数)和宽(列数)。 我们把图像每个像素点看作一个特征值点。那么根据我们研究的问题,比如基本的MNIST数字分类问题,由于它是一个图像对应一个标签, 如下图所示:
MNIST
我们发现这样的一个图像对应一个标签的分类问题,在结构化数据的情况下, 往往将所有的像素点作为一个特征变量, 那么对于MNIST的图像特征变量就是784个。
对于回归问题中,比如一般遥感领域,如下图所示:
remote sensing
每个图像通道可以理解为1个波段,那么我们使用就会是多个图像对应一个图像,这个的图像可以作为预测的图像。那么这里的特征选择的时候就不再使用整个图像像素作为不同的特征,而是将不同的波段作为特征,上图的特征数目就是N个, 那么对应位置的像素提取之后就可以作为一组样本。这样实现图像数据转结构化数据。
在数据转化的过程中,我们一般使用numpy.reshape()进行数据转化。这里进行相应的演示。
1. MNIST分类图像
我们发现numpy中是按行将数据展开,并且按照展开和
### 原始图像
>>> a = np.random.randn(2,3,)
>>> a
array([[ 1.61849466, -1.34764714, -0.19880315],
[ 2.48284474, -0.05315652, -0.02863857]])
### 展开
>>> b = a.reshape(1,6)
>>> b
array([[ 1.61849466, -1.34764714, -0.19880315, 2.48284474, -0.05315652,
-0.02863857]])
### 恢复
>>> c = b.reshape(2,3)
>>> c
array([[ 1.61849466, -1.34764714, -0.19880315],
[ 2.48284474, -0.05315652, -0.02863857]])
2. 多波段遥感图像
np.random.seed(0)
#### a 两个通道 3*2 , 按照 行 优先展开,第一个通道的图像每个像素相当于第一特征变量的所有值,
#### 第二个通道相当于第二个特征变量所有值,依次类推
nrows = 3
ncols = 2
a = np.random.randn(2,nrows,ncols)
print('a:')
print(a)
>>>
a:
[[[ 1.76405235 0.40015721]
[ 0.97873798 2.2408932 ]
[ 1.86755799 -0.97727788]]
[[ 0.95008842 -0.15135721]
[-0.10321885 0.4105985 ]
[ 0.14404357 1.45427351]]]
#### reshape 转化为离散变量,相当于每个通道的对应位置的像素组合成一个样本(也就是一个样本 6个特征)
b = a.reshape(2, nrows * ncols)
print('\nb:')
print(b)
>>>
b:
[[ 1.76405235 0.40015721 0.97873798 2.2408932 1.86755799 -0.97727788]
[ 0.95008842 -0.15135721 -0.10321885 0.4105985 0.14404357 1.45427351]]
### 转置之后相当于分离了样本的(样本数目,特征数)并且位置一一对应
print('\nb transpose:')
print(b.T)
>>>
b transpose:
[[ 1.76405235 0.95008842]
[ 0.40015721 -0.15135721]
[ 0.97873798 -0.10321885]
[ 2.2408932 0.4105985 ]
[ 1.86755799 0.14404357]
[-0.97727788 1.45427351]]
#### 定义一个c与 b.T 做点积运算 d = b.T * c,这样对应样本量的值, 类似样本量个预测值
c = np.array([[1,2],
[2, 3]])
d = np.dot(b.T, c)
#### 输出对应的预测值
print('\nd:')
print(d)
>>>
d:
[[3.66422918 6.37836994]
[0.09744279 0.34624279]
[0.77230028 1.64781941]
[3.0620902 5.7135819 ]
[2.15564513 4.16724669]
[1.93126913 2.40826476]]
print('\n d reshape:')
#### 重新reshape 对应位置的值不变
print(d.T.reshape(2,nrows,ncols))
>>>
d reshape:
[[[3.66422918 6.37836994]
[0.09744279 0.34624279]
[0.77230028 1.64781941]]
[[3.0620902 5.7135819 ]
[2.15564513 4.16724669]
[1.93126913 2.40826476]]]
3. 总结
- numpy中的数据处理是按行操作。
- 根据我们的需求将图像数据转化为结构化数据。
网友评论