代码分解解释
函数定义
def calc_subject_featured_data(data, flag):
CopyInsert
这个函数名为 calc_subject_featured_data
,它接受两个参数:data
和 flag
。data
是一个三维数组,flag
是一个标记值。
数据切片
data = data[:, :, 128 * 3:] # (40, 40, 7680)#将63秒中的前三秒去掉。128*60
这一行代码对输入的 data
进行切片操作,移除了前3秒的数据。原始数据是63秒,每秒有128个数据点,因此总共有 128 * 60 = 7680
个数据点。这里切掉了 128 * 3 = 384
个数据点,剩余 7680
个数据点。
初始化特征数据数组
featured_data = np.zeros([40, 40, 101])
创建一个大小为 40x40x101
的零数组 featured_data
,用于存储处理后的特征数据。
三重循环
for i in range(data.shape[0]):#40
for j in range(data.shape[1]):#40
for k in range(10):#1-10
这里使用了三重循环来遍历 data
数组。外层循环 i
遍历行,中层循环 j
遍历列,内层循环 k
遍历时间段的分割。
特征提取
featured_data[i, j, k * 9:(k + 1) * 9] = calc_features(data[i, j, k * 128 * 6:(k + 1) * 128 * 6])
对于每个时间段(共10个时间段),调用 calc_features
函数计算该时间段内的9个特征,并将结果存储在 featured_data
对应的位置。
整体特征提取
featured_data[i, j, 10 * 9:11 * 9] = calc_features(data[i, j, :])
这一行代码计算每个 (i, j)
位置的所有数据的特征,并将结果存储在 featured_data
的第10个时间段的位置。
附加信息
featured_data[i, j, 99] = j
featured_data[i, j, 100] = flag
将列索引 j
和标记值 flag
分别存储在 featured_data
的第100和101个位置。
返回结果
return featured_data
最后,函数返回处理后的特征数据数组 featured_data
。
代码总结
这个函数的主要功能是处理输入的三维数据 data
,提取每个位置的特征,并将这些特征以及额外的信息(如列索引和标记值)存储在一个新的数组中。这个过程涉及到数据切片、特征计算和数据存储,最终目的是为了后续的数据分析或模型训练。
我的问题1
featured_data = np.zeros([40, 40, 101])中的101是怎么来的,为什么是101
在 featured_data = np.zeros([40, 40, 101])
中,101
这个数字代表了 featured_data
数组的第三个维度的大小,即每个 (i, j)
位置将存储的元素数量。这个大小是由以下几个部分组成的:
-
特征提取:对于每个
(i, j)
位置,数据被分为10个时间段,每个时间段计算9个特征。因此,这部分总共需要10 * 9 = 90
个元素来存储这些特征。 -
整体特征提取:除了每个时间段的特征外,还有一个额外的特征提取步骤,用于计算整个
(i, j)
位置的所有数据的特征。这部分需要额外的9个元素来存储这些特征。 -
附加信息:最后,每个
(i, j)
位置还需要存储两个额外的信息:列索引j
和标记值flag
。这两个信息分别存储在第100和101个位置。
因此,featured_data
的第三个维度大小为 90(时间段特征)+ 9(整体特征)+ 2(附加信息)= 101
。这就是为什么 featured_data
的大小被设置为 [40, 40, 101]
。
我的问题2
为什么是10个时间段,9个特征,这个10和9是怎么来的
在代码中,数据被分成了10个时间段,每个时间段计算9个特征,这个划分是基于数据的特性和处理需求。下面解释为什么选择10个时间段和9个特征:
-
10个时间段: 在原始数据中,每个被试者的数据长度为63秒,每秒有128个数据点,因此总共有
128 * 63
个数据点。在处理数据时,首先去掉了前3秒的数据,剩余128 * 60
个数据点。然后,这些数据被均匀地分为10个时间段,每个时间段包含128 * 6 = 768
个数据点。这种划分可能是为了分析不同时间段内的数据特征,或者是为了适应模型的输入要求。 -
9个特征: 在
calc_features
函数中,对每个时间段的数据计算了9个统计特征,包括均值、中位数、最大值、最小值、标准差、方差、极差(最大值减最小值)、偏度(skew)和峰度(kurt)。这些特征通常用于描述数据的基本统计特性,有助于理解数据的分布和变化。选择这9个特征可能是基于它们在数据分析中的普遍适用性和解释能力。
因此,10个时间段和9个特征的选择可能是基于数据分析的需求和特征提取的目的。这种划分和特征选择有助于从原始数据中提取有用的信息,以便进行进一步的分析或作为机器学习模型的输入。
我的问题3
整体特征提取的9个特征是怎么回事
在代码中,整体特征提取指的是对每个 (i, j)
位置的所有数据(即整个 40x40
矩阵的数据)进行特征提取,而不是像时间段特征提取那样只针对每个时间段的数据。这9个特征是通过 calc_features
函数计算得到的,该函数定义如下:
def calc_features(data):
result = []
result.append(np.mean(data))
result.append(np.median(data))
result.append(np.max(data))
result.append(np.min(data))
result.append(np.std(data))
result.append(np.var(data))
result.append(np.max(data) - np.min(data))
result.append(pd.Series(data).skew())
result.append(pd.Series(data).kurt())
return result
这个函数计算了以下9个特征:
- 均值:数据的平均值。
- 中位数:数据的中位数。
- 最大值:数据的最大值。
- 最小值:数据的最小值。
- 标准差:数据的样本标准差,衡量数据的离散程度。
- 方差:数据的样本方差,也是衡量数据离散程度的指标。
- 极差:数据的最大值减去最小值,表示数据范围的大小。
- 偏度:数据的偏度,衡量数据分布的不对称性。
- 峰度:数据的峰度,衡量数据分布的尖峭或平坦程度。
在整体特征提取部分,这些特征是基于每个 (i, j)
位置的所有数据计算的,而不是基于分割的时间段。这样做的目的是为了获得每个位置数据的整体统计特性,这些特性可以反映数据的整体趋势和分布情况。这些特征随后被存储在 featured_data
的相应位置,以便后续分析使用。