我遵循the answer to this questionthis scikit-learn tutorial来go 除脑电信号中的伪影.它们看起来很简单,我肯定错过了一些显而易见的东西.

提取的成分与我的信号长度不同.我有88个频道的几个小时的录音,所以我的信号矩阵的形状是(888088516).然而ICA的输出是(88,88).除了很短之外,每个组件似乎都捕捉到了非常大的、看起来有噪音的偏转(所以在88个组件中,只有一对看起来像信号,其余的看起来像噪音).我还以为只有几个部件看起来很吵.我怀疑我做错了什么?

通道x样本的矩阵具有形状(888088516).

enter image description here

示例代码(仅使用随机矩阵进行最低限度的工作):

import numpy as np
from sklearn.decomposition import FastICA
import matplotlib.pyplot as plt

samples_matrix = np.random.random((88, 8088516))

# Compute ICA
ica = FastICA(n_components=samples_matrix.shape[0])  # Extracting as many components as there are channels, i.e. 88
components = ica.fit_transform(samples_matrix)  # Reconstruct signals
A_ = ica.mixing_  # Get estimated mixing matrix

组件的形状为(88,88).其中一个是这样的:

plt.plot(components[1])

enter image description here

我本以为这些成分是与我最初的as shown in the answer to this question个时间序列长度相同的时间序列.我真的不知道如何在这一点上推进组件移除和信号重建.

推荐答案

您需要在samples_matrix的转置上运行fit_transform,而不是samples_matrix本身(因此为该方法提供8088516 x 88矩阵,而不是88x8088516).

ica.fit_transform(samples_matrix.transpose())

或者更简单地说

ica.fit_transform(samples_matrix.T)

这将为您提供一组8088516 x 88的信号(88个组件,每个组件的信号长度与原始信号相同),用于绘图.正如我在下面的 comments 中提到的,由于矩阵倒置等原因,我的设置建议不超过64个组件.

为了支持这个建议,我看了your tutorial个,他们将玩具问题设置为:

n_samples = 2000
time = np.linspace(0, 8, n_samples)

s1 = np.sin(2 * time)  # Signal 1 : sinusoidal signal
s2 = np.sign(np.sin(3 * time))  # Signal 2 : square signal
s3 = signal.sawtooth(2 * np.pi * time)  # Signal 3: saw tooth signal

S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)  # Add noise

S /= S.std(axis=0)  # Standardize data
# Mix data
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])  # Mixing matrix
X = np.dot(S, A.T)  # Generate observations

这给出了一个X.shape/(2000,3)来分隔这3个组分,表明这是FastICA方法的首选矩阵格式.

Python相关问答推荐

如果在第一行之前不存在其他条件,如何获得满足口罩条件的第一行?

在编写要Excel的数据透视框架时修复标题行

阅读Polars Python中管道的函数定义

在应用循环中间保存pandas DataFrame

剧作家Python没有得到回应

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

使用mySQL的SQlalchemy过滤重叠时间段

DataFrame groupby函数从列返回数组而不是值

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

如何让程序打印新段落上的每一行?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

使用Python更新字典中的值

driver. find_element无法通过class_name找到元素'""

根据列值添加时区

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

当点击tkinter菜单而不是菜单选项时,如何执行命令?

启用/禁用shiny 的自动重新加载

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败

搜索按钮不工作,Python tkinter

替换现有列名中的字符,而不创建新列