Em formação

Como você denoise e extrai recursos de dados de EEG com Python?

Como você denoise e extrai recursos de dados de EEG com Python?


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Eu tenho dados de EEG com 5 colunas (1 para cada eletrodo) e preciso remover o ruído e extrair recursos deles usando Python. Tentei encontrar pacotes relevantes, mas minha pesquisa continuou me levando ao MNE, que leva como dados de entrada em um formato que eu não tenho. Meus dados estão em um dataframe do pandas.

minhas perguntas são:

  1. Como você elimina esse conjunto de dados?
  2. Como você faz a extração de recursos para ele?

Obrigado :)


você pode converter seu frame de dados em array numpy usando

data = df.to_numpy ()

Se seus dados são de teste único, significando conjunto de dados bidimensional, você pode usar

channel_names = df.columns.tolist () channel_types = len (channel_names) * ['eeg'] sfreq = 1000 # em Hertz montage = 'standard_1005' info = mne.create_info (channel_names, sfreq, channel_types, montagem) raw = mne. io.RawArray (dados, informações)

Se você tiver conjunto de dados multitrials

channel_names = df.columns.tolist () channel_types = len (channel_names) * ['eeg'] sfreq = 1000 # em Hertz montage = 'standard_1005' info = mne.create_info (channel_names, sfreq, channel_types, montagem) data = data. remodelar (len (channel_names), - 1, sfreq * time) data = np.swapaxes (data, 0,1) epochs = mne.EpochsArray (sub, info)

Depois de converter seu conjunto de dados em estrutura mne, você pode usar filtros e recursos mne


Definindo épocas e calculando o ERP para condição auditiva esquerda

rejeitar = dict (eeg = 180e-6, eog = 150e-6) event_id, tmin, tmax = <'left / auditory': 1>, -0.2, 0.5 events = mne.read_events (event_fname) epochs_params = dict (events = eventos, event_id = event_id, tmin = tmin, tmax = tmax, rejeitar = rejeitar)

Extraindo recursos

Uma vez que grande parte do processamento de ERP moderno envolve aprendizado de máquina, o termo "recurso" é frequentemente usado em análises de ERP. UMA recurso é uma propriedade medida de um sinal que é usado como entrada para o algoritmo de aprendizado de máquina. Por exemplo, um recurso comumente usado para ERPs é tensão média do sinal em cada ponto de tempo em todas as épocas. A extração desse recurso não requer grande computação ou processamento e é fácil de implementar no MNE:

evoked_no_ref = mne.Epochs (raw_no_ref, ** epochs_params) .average () del raw_no_ref # salvar memória

title = ‘EEG com referência original’ evoked_no_ref.plot (title = dict (eeg = title)) del raw_no_ref # salvar memória

Uma vez que temos um vetor de recursos, isso pode ser usado na etapa de classificação do BCI para produzir resultados significativos usando aprendizado de máquina (por exemplo, Regressão Linear Simples, Análise Discriminante Linear, Regressão de Vetor de Suporte).


4 respostas 4

  • Quer dizer.
  • Variância.
  • Skewness.
  • Curtose.
  • 3 frequências dominantes no DFT.
  • Energia das 3 frequências dominantes.
  • Valor máximo.
  • Valor mínimo.
  • Mediana.
  • Variação total.

Normalmente, eu os computaria no Windows em execução.
Outra grande informação é o Histograma da Derivada.
Ou apenas todos os itens acima do Derivativo.

Além dos recursos mencionados até agora, gostaria de mencionar medidas de complexidade, como:

Existem também Descritores de Fourier (como já sugerido por Drazick) e seus equivalentes na Análise Wavelet e, claro, caixas de histograma simples que retornariam a frequência com que cada marcha é engatada no caminho.

Mas também, que mais cedo ou mais tarde você precisará colocar esses recursos e os resultados da análise que os envolve em algum contexto relevante para o mundo real. Isso dará algum tipo de significado a essas quantidades.

Por exemplo, um valor médio forneceria informações sobre as marchas mais usadas na rota "média" em que o veículo estava rodando enquanto a captura de dados estava ocorrendo (por exemplo, marchas mais baixas ou marchas mais altas). A variação pode fornecer uma medida da gama de marchas usadas no trajeto. Uma medida mais simples de mudança de marcha poderia ser a quantidade de diferentes estados pelos quais a caixa de marcha parece estar passando, por unidade de tempo. Por exemplo, 3,5 mudanças de marcha por minuto. Você pode usar isso para agrupar os dados em trocadores de marcha frequentes e menos frequentes e investigar a questão de saber se as mudanças de marcha frequentes têm um impacto na falha da caixa de engrenagens, se a falha da caixa de engrenagens estiver principalmente associada a marchas mais baixas (ou seja, maior carga) e outras.

Apenas calcular cegamente características das formas de onda e usá-las para agrupar casos não vai ser suficiente, mais cedo ou mais tarde você terá que se perguntar "O que isso significa no mundo real?"


1 resposta 1

Não tenho certeza se você está familiarizado com o processamento geral de sinais, então tentarei ser claro, mas não mastigarei para você.

Wavelets são essencialmente bancos de filtros. Cada filtro divide um determinado sinal em duas sub-bandas independentes de alta frequência e baixa frequência, não sobrepostas, de modo que ele pode então ser reconstruído por meio de uma transformação inversa. Quando esses filtros são aplicados continuamente, você obtém uma árvore de filtros com a saída de um alimentado no próximo. A maneira mais simples e intuitiva de construir essa árvore é a seguinte:

  • Decompor um sinal em componentes de baixa frequência (aproximação) e alta frequência (detalhe)
  • Pegue o componente de baixa frequência e execute o mesmo processamento naquele
  • Continue até que tenha processado o número necessário de níveis

A razão para isso é que você pode reduzir a resolução do sinal de aproximação resultante. Por exemplo, se o seu filtro divide um sinal com frequência de amostragem (Fs) 48.000 Hz - que produz frequência máxima de 24.000 Hz pelo Teorema de Nyquist - em componente de aproximação de 0 a 12.000 Hz e componente de detalhe de 12001 a 24.000 Hz, você pode então tomar cada segunda amostra do componente de aproximação sem aliasing, essencialmente dizimando o sinal. Isso é amplamente usado na compressão de sinal e imagem.

De acordo com essa descrição, no nível um, você divide o conteúdo de sua frequência ao meio e cria dois sinais separados. Então você pega seu componente de frequência inferior e o divide ao meio novamente. Agora você obtém três componentes no total: 0 a 6.000 Hz, 6001 a 12.000 Hz e 12001 a 24.000 Hz. Você vê que os dois componentes mais novos têm metade da largura de banda do primeiro componente de detalhe. Você tem esse tipo de imagem:

Isso se correlaciona com as larguras de banda que você descreveu acima (2 ^ 1 Hz, 2 ^ 2 Hz, 2 ^ 3 Hz e assim por diante). No entanto, usando uma definição mais ampla de um banco de filtro, podemos organizar a estrutura de árvore acima como quisermos, e ainda permanecerá um banco de filtros. Por exemplo, podemos alimentar Ambas aproximação e componente de detalhe para se dividir em dois sinais de alta frequência e baixa frequência como tal

Se você olhar com atenção, verá que os componentes de alta e baixa frequência estão no meio em suas frequências e, como resultado, você obtém um banco de filtro uniforme cuja separação de frequência se parece mais com isto:

Observe que todas as bandas são do mesmo tamanho. Ao construir um banco de filtros uniforme com N níveis, você acaba com respostas de 2 ^ (N-1) filtros de banda-graves. Você pode fazer o ajuste fino do banco de filtros para, eventualmente, obter a banda desejada (8-13 Hz).

Em geral, eu não aconselharia você a fazer isso com wavelets. Você pode ler alguma literatura sobre como projetar bons filtros passa-banda e simplesmente construir um filtro que deixe passar apenas 8-13 Hz de seus sinais de EEG. Isso é o que eu fiz antes e funcionou muito bem para mim.


Classificação de imagens motoras a partir de dados de EEG: seleção de recursos

Sou um estudante de graduação que está tentando classificar as imagens motoras a partir de dados de EEG!

Não tenho experiência de trabalho com EEG ou qualquer formação em neurociência, só tenho um conhecimento muito básico de como funcionam EEG, ERD / ERS e domínio da frequência a partir dos artigos que tentei ler, mas não entendi e a ideia básica do que eles estão fazendo. Também tenho um conhecimento razoavelmente básico de Aprendizado de Máquina supervisionado.

Pretendo usar ERD / ERS para classificar o pé esquerdo, a mão direita e o descanso para classificar as imagens motoras em tempo real!

Qual é a maneira mais fácil de fazer a seleção de recursos nos dados EEG para ERD / ERS?

Até agora, passei de banda os dados entre 7-30 Hz para os comprimentos de onda Mu e Beta, pois eles são os relacionados às imagens do motor, bem como removi a linha de base e apenas tracei a densidade espectral de potência. Passei esses dados através de um SVM básico linear e gaussiano, parâmetros otimizados com resultados ruins (60% de acerto em média). A partir deste gráfico, não tenho certeza de como posso extrair os recursos que definem cada categoria.

Não sei como fazer extração de recursos e por onde começar a aprender o básico.

Se alguém pudesse me orientar e fornecer os passos de como proceder ficaria extremamente grato!

Eu quero trabalhar na área de Interfaces Cérebro-Computador, pois acho isso fascinante, este é o meu primeiro passo :)


Como extrair recursos de dados de texto em python?

Estou tentando construir um algoritmo de aprendizado de máquina para prever o número que uma pessoa está pensando com base em sinais de eeg do cérebro. O conjunto de dados que encontrei está disponível em formato de texto e é descrito como- "Os dados são armazenados em um formato de texto muito simples Incluindo:

[id]: um numérico, apenas para fins de referência.

[evento] id, um número inteiro, usado para distinguir o mesmo evento capturado em diferentes locais do cérebro, usado apenas por dispositivos multicanais (todos exceto MW).

[dispositivo]: uma string de 2 caracteres para identificar o dispositivo usado para capturar os sinais, "MW" para MindWave, "EP" para Emotive Epoc, "MU" para Interaxon Muse e amp "IN" para Emotiv Insight.

[canal]: uma string, para identificar a localização 10/20 do cérebro do sinal, com valores possíveis:

MindWave "FP1" EPOC "AF3," F7 "," F3 "," FC5 "," T7 "," P7 "," O1 "," O2 "," P8 "," T8 "," FC6 "," F4 "," F8 "," AF4 "Muse" TP9, "FP1", "FP2", "TP10" Insight "AF3," AF4 "," T7 "," T8 "," PZ "

[código]: um inteiro, para identificar o dígito pensado / visto, com valores possíveis 0,1,2,3,4,5,6,7,8,9 ou -1 para sinais capturados aleatoriamente não relacionados a nenhum dos os dígitos.

[tamanho]: um inteiro, para identificar o tamanho em número de valores capturados nos 2 segundos desse sinal, visto que o Hz de cada dispositivo varia, em "teoria" o valor é próximo a 512 Hz para MW, 128 Hz para EP, 220 Hz para MU e amp 128Hz para IN, para cada um dos 2 segundos.

[dados]: um conjunto de números separados por vírgulas, com a amplitude da série temporal do sinal, cada dispositivo usa uma precisão diferente para identificar o potencial elétrico capturado do cérebro: inteiros no caso de MW & amp MU ou números reais no caso de EP & amp IN.

Não há cabeçalhos nos arquivos, cada linha é um sinal e os campos são separados por uma guia " Como faço para trabalhar com esses dados (plotar os dados, treinar modelos diferentes sobre eles)? Devo converter isso para outro formato? se sim, então como? Link do conjunto de dados-http: //www.mindbigdata.com/opendb/MindBigData-MW-v1.0.zip

Já usei um arquivo csv para um projeto de ml semelhante, mas não tenho ideia de como usar este, pois há um cabeçalho separado antes dos dados de cada sinal como faço para extrair esses sinais


Como extrair os seguintes recursos de domínio de frequência em Python?

Portanto, esta é uma questão muito básica e eu só tenho um conhecimento de nível iniciante sobre processamento de sinais. Eu tenho dados de um acelerômetro de 1,02 segundo amostrados em 32.000 Hz. Estou procurando extrair os seguintes recursos de domínio de frequência após ter executado FFT em python -

Freq média, Freq mediana, Deformação do espectro de potência, energia do espectro, curtose espectral, assimetria espectral, entropia espectral, RMSF (Freq. Quadrada média), RVF (frequência de variância raiz), Cepstrum de potência.

Mais especificamente, estou procurando gráficos desses recursos como uma saída final.

O arquivo csv contendo dados tem quatro colunas: Tempo, Valor do eixo X, Valor do eixo Y, Valor do eixo Z (o acelerômetro é triaxial). Até agora, no python, fui capaz de visualizar os dados do domínio do tempo, aplicar filtro de convolução a eles, aplicar FFT e gerar um espectograma que mostra um choque interessante


2 respostas 2

A função do kernel RBF para dois vetores $ mathbf$ e $ mathbf$ se parece com isto: $ kappa ( mathbf, mathbf) = exp (- gamma | mathbf- mathbf|^2). $

Essencialmente, seus resultados indicam que seus valores para $ gamma $ são caminho muito alto. Quando isso acontece, a matriz kernel torna-se essencialmente a matriz unitária, porque $ | mathbf- mathbf | ^ 2 $ é maior que 0 se $ mathbf neq mathbf$ e 0 caso contrário, o que leva a valores de kernel de $ approx 0 $ e 1 respectivamente quando $ gamma $ é muito grande (considere o limite $ gamma = infty $).

Isso leva a um modelo SVM no qual todas as instâncias de treinamento são vetores de suporte e esse modelo se ajusta perfeitamente aos dados de treinamento. Claro, quando você prevê um conjunto de teste, todas as previsões serão idênticas ao viés do modelo $ rho $ porque os cálculos do kernel são todos zero, ou seja: $ f ( mathbf) = underbrace < sum_ alpha_i y_i kappa ( mathbf_i, mathbf)>_ + rho, $ onde $ mathbf_i $ é o enésimo vetor de suporte e $ alpha_i $ é seu peso dual correspondente.


Python: aplique a função em categorias e salve os resultados em novas colunas

Eu sou novo em Python. Estou analisando dados de EEG. Eu criei a função extract_bands para calcular os valores do Bandas EEG (com base nesta resposta), mas estou tendo problemas para aplicar a função entre categorias e salvar os dados agregados em um novo conjunto de dados

Este é um conjunto de dados simplificado, pddf:

Aqui está a função extract_bands:

Posso aplicar a função a uma tentativa e obter os valores das bandas de EEG salvos em um dicionário, eeg_band_fft. No conjunto de dados real, cada tentativa tem 256 amostras aqui, uma tentativa tem apenas 2 amostras, então a função retorna o valor apenas para a banda Delta.

Agora, como posso aplicar a função extract_bands em ensaios pertencentes à mesma condição cond, para cada sujeito?

Basicamente, gostaria de retornar um conjunto de dados com uma linha para cada cond por sujeito, e um total de oito colunas: 'assunto', 'grupo', 'cond' e os valores para as cinco bandas de EEG do dicionário eeg_band_fft.

O código a seguir faz o que eu quero (para calcular médias) usando groupby, mas não sei como fazê-lo funcionar usando a função extract_bands.


2 respostas 2

Segmentos sobrepostos não causam nenhum problema, a menos que seu projeto experimental o convença de que tais segmentos não devem ser permitidos

Presumo que você queira segmentar seus dados de EEG para usar os segmentos únicos como entradas de treinamento rotuladas para algum algoritmo de aprendizado de máquina. Aqui, cada um dos rótulos geralmente contém uma referência a um índice inicial e final do sinal. Nesse caso, os índices determinam seus segmentos de EEG diretamente. (Suponho que seja isso o que você quer dizer com sua opção 1.)

Antes de segmentar, é claro que você pode extrair alguns recursos ao longo do sinal que também podem ser segmentados de acordo.

Se você fosse usar uma função de janela durante a segmentação, como exatamente o faria? Uma função de janela pode ser usada nos casos em que você deseja pesar novamente o sinal para algum propósito específico, por exemplo. Isso não faz sentido aqui, tanto quanto posso dizer.


Como extrair os seguintes recursos de domínio de frequência em Python?

Portanto, esta é uma questão muito básica e eu só tenho um conhecimento de nível iniciante sobre processamento de sinais. Eu tenho dados de um acelerômetro de 1,02 segundo amostrados em 32.000 Hz. Estou procurando extrair os seguintes recursos de domínio de frequência após ter executado FFT em python -

Freq média, Freq mediana, Deformação do espectro de potência, energia do espectro, curtose espectral, assimetria espectral, entropia espectral, RMSF (Freq. Quadrada média), RVF (frequência de variância raiz), Cepstrum de potência.

Mais especificamente, estou procurando gráficos desses recursos como uma saída final.

O arquivo csv contendo dados tem quatro colunas: Tempo, Valor do eixo X, Valor do eixo Y, Valor do eixo Z (o acelerômetro é triaxial). Até agora, no python, fui capaz de visualizar os dados do domínio do tempo, aplicar filtro de convolução a eles, aplicar FFT e gerar um espectograma que mostra um choque interessante


Como extrair recursos de dados de texto em python?

Estou tentando construir um algoritmo de aprendizado de máquina para prever o número que uma pessoa está pensando com base em sinais de eeg do cérebro. O conjunto de dados que encontrei está disponível em formato de texto e é descrito como- "Os dados são armazenados em um formato de texto muito simples Incluindo:

[id]: um numérico, apenas para fins de referência.

[evento] id, um número inteiro, usado para distinguir o mesmo evento capturado em diferentes locais do cérebro, usado apenas por dispositivos multicanais (todos exceto MW).

[dispositivo]: uma string de 2 caracteres, para identificar o dispositivo usado para capturar os sinais, "MW" para MindWave, "EP" para Emotive Epoc, "MU" para Interaxon Muse e amp "IN" para Emotiv Insight.

[canal]: uma string, para identificar a localização 10/20 do cérebro do sinal, com valores possíveis:

MindWave "FP1" EPOC "AF3," F7 "," F3 "," FC5 "," T7 "," P7 "," O1 "," O2 "," P8 "," T8 "," FC6 "," F4 "," F8 "," AF4 "Muse" TP9, "FP1", "FP2", "TP10" Insight "AF3," AF4 "," T7 "," T8 "," PZ "

[código]: um inteiro, para identificar o dígito pensado / visto, com valores possíveis 0,1,2,3,4,5,6,7,8,9 ou -1 para sinais capturados aleatoriamente não relacionados a nenhum dos os dígitos.

[tamanho]: um inteiro, para identificar o tamanho em número de valores capturados nos 2 segundos desse sinal, visto que o Hz de cada dispositivo varia, em "teoria" o valor é próximo a 512 Hz para MW, 128 Hz para EP, 220 Hz para MU e amp 128Hz para IN, para cada um dos 2 segundos.

[dados]: um conjunto de números separados por vírgulas, com a amplitude da série temporal do sinal, cada dispositivo usa uma precisão diferente para identificar o potencial elétrico capturado do cérebro: inteiros no caso de MW & amp MU ou números reais no caso de EP & amp IN.

Não há cabeçalhos nos arquivos, cada linha é um sinal e os campos são separados por uma guia " Como faço para trabalhar com esses dados (plotar os dados, treinar modelos diferentes sobre eles)? Devo converter isso para outro formato? se sim, como? Link do conjunto de dados-http: //www.mindbigdata.com/opendb/MindBigData-MW-v1.0.zip

Já usei um arquivo csv para um projeto de ml semelhante, mas não tenho ideia de como usá-lo, pois há um cabeçalho separado antes dos dados de cada sinal, como faço para extrair esses sinais


2 respostas 2

A função do kernel RBF para dois vetores $ mathbf$ e $ mathbf$ se parece com isto: $ kappa ( mathbf, mathbf) = exp (- gamma | mathbf- mathbf|^2). $

Essencialmente, seus resultados indicam que seus valores para $ gamma $ são caminho muito alto. Quando isso acontece, a matriz kernel torna-se essencialmente a matriz unitária, porque $ | mathbf- mathbf | ^ 2 $ é maior que 0 se $ mathbf neq mathbf$ e 0 caso contrário, o que leva a valores de kernel de $ approx 0 $ e 1 respectivamente quando $ gamma $ é muito grande (considere o limite $ gamma = infty $).

Isso leva a um modelo SVM no qual todas as instâncias de treinamento são vetores de suporte e esse modelo se ajusta perfeitamente aos dados de treinamento. Claro, quando você prevê um conjunto de teste, todas as previsões serão idênticas ao viés do modelo $ rho $ porque os cálculos do kernel são todos zero, ou seja: $ f ( mathbf) = underbrace < sum_ alpha_i y_i kappa ( mathbf_i, mathbf)>_ + rho, $ onde $ mathbf_i $ é o enésimo vetor de suporte e $ alpha_i $ é seu peso dual correspondente.


Python: aplique a função em categorias e salve os resultados em novas colunas

Eu sou novo em Python. Estou analisando dados de EEG. Eu criei a função extract_bands para calcular os valores do Bandas EEG (com base nesta resposta), mas estou tendo problemas para aplicar a função entre categorias e salvar os dados agregados em um novo conjunto de dados

Este é um conjunto de dados simplificado, pddf:

Aqui está a função extract_bands:

Posso aplicar a função a uma tentativa e obter os valores das bandas de EEG salvos em um dicionário, eeg_band_fft. No conjunto de dados real, cada tentativa tem 256 amostras aqui, uma tentativa tem apenas 2 amostras, então a função retorna o valor apenas para a banda Delta.

Agora, como posso aplicar a função extract_bands em ensaios pertencentes à mesma condição cond, para cada sujeito?

Basicamente, gostaria de retornar um conjunto de dados com uma linha para cada cond por sujeito, e um total de oito colunas: 'assunto', 'grupo', 'cond' e os valores para as cinco bandas de EEG do dicionário eeg_band_fft.

O código a seguir faz o que eu quero (para calcular médias) usando groupby, mas não sei como fazê-lo funcionar usando a função extract_bands.


Definindo épocas e calculando o ERP para condição auditiva esquerda

rejeitar = dict (eeg = 180e-6, eog = 150e-6) event_id, tmin, tmax = <'left / auditory': 1>, -0.2, 0.5 events = mne.read_events (event_fname) epochs_params = dict (events = eventos, event_id = event_id, tmin = tmin, tmax = tmax, rejeitar = rejeitar)

Extraindo recursos

Uma vez que grande parte do processamento de ERP moderno envolve aprendizado de máquina, o termo "recurso" é frequentemente usado em análises de ERP. UMA recurso é uma propriedade medida de um sinal que é usado como entrada para o algoritmo de aprendizado de máquina. Por exemplo, um recurso comumente usado para ERPs é tensão média do sinal em cada ponto de tempo em todas as épocas. A extração desse recurso não requer grande computação ou processamento e é fácil de implementar no MNE:

evoked_no_ref = mne.Epochs (raw_no_ref, ** epochs_params) .average () del raw_no_ref # salvar memória

title = ‘EEG com referência original’ evoked_no_ref.plot (title = dict (eeg = title)) del raw_no_ref # salvar memória

Uma vez que temos um vetor de recursos, isso pode ser usado na etapa de classificação do BCI para produzir resultados significativos usando aprendizado de máquina (por exemplo, Regressão Linear Simples, Análise Discriminante Linear, Regressão de Vetor de Suporte).


4 respostas 4

  • Quer dizer.
  • Variância.
  • Skewness.
  • Curtose.
  • 3 frequências dominantes no DFT.
  • Energia das 3 frequências dominantes.
  • Valor máximo.
  • Valor mínimo.
  • Mediana.
  • Variação total.

Normalmente, eu os computaria no Windows em execução.
Outra grande informação é o Histograma da Derivada.
Ou apenas todos os itens acima do Derivativo.

Além dos recursos mencionados até agora, gostaria de mencionar medidas de complexidade, como:

Existem também Descritores de Fourier (como já sugerido por Drazick) e seus equivalentes na Análise Wavelet e, claro, caixas de histograma simples que retornariam a frequência com que cada marcha é engatada no caminho.

Mas também, que mais cedo ou mais tarde você precisará colocar esses recursos e os resultados da análise que os envolve em algum contexto relevante para o mundo real. Isso dará algum tipo de significado a essas quantidades.

Por exemplo, um valor médio forneceria informações sobre as marchas mais usadas na rota "média" em que o veículo estava rodando enquanto a captura de dados estava ocorrendo (por exemplo, marchas mais baixas, ou marchas mais altas). A variação pode fornecer uma medida da gama de marchas usadas no trajeto. Uma medida mais simples de mudança de marcha poderia ser a quantidade de diferentes estados pelos quais a caixa de marcha parece estar passando, por unidade de tempo. Por exemplo, 3,5 mudanças de marcha por minuto. Você pode usar isso para agrupar os dados em trocadores de marcha frequentes e menos frequentes e investigar a questão de saber se as mudanças de marcha frequentes têm um impacto na falha da caixa de engrenagens, se a falha da caixa de engrenagens estiver principalmente associada a marchas mais baixas (ou seja, maior carga) e outras.

Apenas calcular cegamente características das formas de onda e usá-las para agrupar casos não vai ser suficiente, mais cedo ou mais tarde você terá que se perguntar "O que isso significa no mundo real?"


1 resposta 1

Não tenho certeza se você está familiarizado com o processamento geral de sinais, então tentarei ser claro, mas não mastigarei para você.

Wavelets são essencialmente bancos de filtros. Cada filtro divide um determinado sinal em duas sub-bandas independentes de alta frequência e baixa frequência, não sobrepostas, de modo que ele pode então ser reconstruído por meio de uma transformação inversa. Quando esses filtros são aplicados continuamente, você obtém uma árvore de filtros com a saída de um alimentado no próximo. A maneira mais simples e intuitiva de construir essa árvore é a seguinte:

  • Decompor um sinal em componentes de baixa frequência (aproximação) e alta frequência (detalhe)
  • Pegue o componente de baixa frequência e execute o mesmo processamento naquele
  • Continue até que tenha processado o número necessário de níveis

A razão para isso é que você pode reduzir a resolução do sinal de aproximação resultante. Por exemplo, se o seu filtro divide um sinal com frequência de amostragem (Fs) 48.000 Hz - que produz frequência máxima de 24.000 Hz pelo Teorema de Nyquist - em componente de aproximação de 0 a 12.000 Hz e componente de detalhe de 12001 a 24.000 Hz, você pode então tomar cada segunda amostra do componente de aproximação sem aliasing, essencialmente dizimando o sinal. Isso é amplamente usado na compressão de sinal e imagem.

De acordo com essa descrição, no nível um, você divide o conteúdo de sua frequência ao meio e cria dois sinais separados. Então você pega seu componente de frequência inferior e o divide ao meio novamente. Agora você obtém três componentes no total: 0 a 6.000 Hz, 6001 a 12.000 Hz e 12001 a 24.000 Hz. Você vê que os dois componentes mais novos têm metade da largura de banda do primeiro componente de detalhe. Você tem esse tipo de imagem:

Isso se correlaciona com as larguras de banda que você descreveu acima (2 ^ 1 Hz, 2 ^ 2 Hz, 2 ^ 3 Hz e assim por diante). No entanto, usando uma definição mais ampla de um banco de filtro, podemos organizar a estrutura de árvore acima como quisermos, e ainda permanecerá um banco de filtros. Por exemplo, podemos alimentar Ambas aproximação e componente de detalhe para se dividir em dois sinais de alta frequência e baixa frequência como tal

Se você olhar com atenção, verá que os componentes de alta e baixa frequência estão no meio em suas frequências e, como resultado, você obtém um banco de filtro uniforme cuja separação de frequência se parece mais com isto:

Observe que todas as bandas são do mesmo tamanho. Ao construir um banco de filtros uniforme com N níveis, você acaba com respostas de 2 ^ (N-1) filtros de banda-graves. Você pode fazer o ajuste fino do banco de filtros para, eventualmente, obter a banda desejada (8-13 Hz).

Em geral, eu não aconselharia você a fazer isso com wavelets. Você pode ler alguma literatura sobre o projeto de bons filtros passa-banda e simplesmente construir um filtro que permita a passagem de apenas 8-13 Hz de seus sinais de EEG. Isso é o que eu fiz antes e funcionou muito bem para mim.


2 respostas 2

Segmentos sobrepostos não causam nenhum problema, a menos que seu projeto experimental o convença de que tais segmentos não devem ser permitidos

Presumo que você queira segmentar seus dados de EEG para usar os segmentos únicos como entradas de treinamento rotuladas para algum algoritmo de aprendizado de máquina. Aqui, cada um dos rótulos geralmente contém uma referência a um índice inicial e final do sinal. Nesse caso, os índices determinam seus segmentos de EEG diretamente. (Suponho que seja isso o que você quer dizer com sua opção 1.)

Antes de segmentar, é claro que você pode extrair alguns recursos ao longo do sinal que também podem ser segmentados de acordo.

Se você fosse usar uma função de janela durante a segmentação, como exatamente o faria? Uma função de janela pode ser usada nos casos em que você deseja pesar novamente o sinal para algum propósito específico, por exemplo. Não faz sentido aqui, tanto quanto posso dizer.


Classificação de imagens motoras a partir de dados de EEG: seleção de recursos

Sou um estudante de graduação que está tentando classificar as imagens motoras a partir de dados de EEG!

Não tenho experiência de trabalho com EEG ou qualquer formação em neurociência, só tenho um conhecimento muito básico de como funcionam EEG, ERD / ERS e domínio da frequência a partir dos artigos que tentei ler, mas não entendi e a ideia básica do que eles estão fazendo. Também tenho um conhecimento razoavelmente básico de Aprendizado de Máquina supervisionado.

Pretendo usar ERD / ERS para classificar o pé esquerdo, a mão direita e o descanso para classificar as imagens motoras em tempo real!

Qual é a maneira mais fácil de fazer a seleção de recursos nos dados EEG para ERD / ERS?

Até agora, passei de banda os dados entre 7 e 30 Hz para os comprimentos de onda Mu e Beta, pois eles são os relacionados às imagens do motor, bem como removi a linha de base e apenas plotei a densidade espectral de potência. Passei esses dados por meio de um SVM básico linear e gaussiano, parâmetros otimizados com resultados ruins (60% de acerto em média). A partir deste gráfico, não tenho certeza de como posso extrair os recursos que definem cada categoria.

Não sei como fazer extração de recursos e por onde começar a aprender o básico.

Se alguém pudesse me orientar e fornecer os passos de como proceder ficaria extremamente grato!

Eu quero trabalhar na área de Interfaces Cérebro-Computador, pois acho isso fascinante, este é o meu primeiro passo :)