You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python下EEG矩阵强度归一化:多时间点散点图整合优化问询

EEG通道-时间矩阵散点图归一化优化问题

我有一个矩阵,行代表EEG通道,列代表不同时间段,单元格存储信号强度值。此前针对每列单独绘制散点图时,X轴取电极相对距离(以该列强度最高的电极为起点),Y轴取强度相对下降值,能清晰看到二者的相关性。现在想把所有列的数据点整合到同一张散点图中,但需要找到合适的强度下降值归一化方法——之前尝试按列归一化(每个数据点除以所在列的最大强度),但合并后的散点图没能体现出单列图里的明显规律。

原实现代码

import numpy as np
import matplotlib.pyplot as plt

def create_scatter_plot(matrix, electrode_names, calculate_distance, positions_df, threshold, min_values):
    n_rows, n_columns = matrix.shape
    
    normalized_intensity_diffs = []
    normalized_distances = []
    
    
    for i in range(n_columns):
        column = matrix[:, i]
        above_threshold = column > threshold
        if np.sum(above_threshold) < min_values:
            continue
        
        max_intensity_index = np.argmax(column)
        max_intensity = column[max_intensity_index]
        
        for j in range(n_rows):
            if j != max_intensity_index and above_threshold[j]:
                intensity_diff = column[j]/max_intensity
                normalized_intensity_diff = intensity_diff
                
                electrode_name1 = electrode_names[max_intensity_index]
                electrode_name2 = electrode_names[j]
                distance = calculate_distance(electrode_name1, electrode_name2, positions_df)
   
                
                normalized_intensity_diffs.append(normalized_intensity_diff)
                normalized_distances.append(distance)
    
    plt.scatter(normalized_distances, normalized_intensity_diffs)
    plt.xlabel("Distance")
    plt.ylabel("Intensity Difference")
    plt.show()
    return normalized_distances, normalized_intensity_diffs

可选的归一化优化方案

1. 全局Z-score标准化

针对所有列收集到的强度相对值做全局Z-score转换,消除不同时间段的基线波动,让跨列的数据分布更统一:

# 在原函数末尾,收集完数据后添加Z-score转换
from scipy.stats import zscore

# 替换原plt.scatter部分
intensity_z = zscore(normalized_intensity_diffs)
plt.scatter(normalized_distances, intensity_z)
plt.xlabel("Distance")
plt.ylabel("Z-scored Intensity Ratio")
plt.show()

2. 按列Min-Max归一化到统一区间

把每列的强度相对下降值映射到[0,1]区间,保留单列内的相对差异,同时让不同列的数据落在统一值域内:
修改原函数内的归一化计算逻辑:

# 替换循环内的intensity_diff计算部分
column_above = column[above_threshold]
min_intensity = column_above.min()
# 若要体现"强度下降幅度",可改为(max_intensity - column[j])/(max_intensity - min_intensity)
normalized_intensity_diff = (column[j] - min_intensity) / (max_intensity - min_intensity)

3. 基于全局峰值的加权归一化

如果原相对比例(column[j]/max_intensity)本身有物理意义,可以通过全局峰值的均值对各列的比例做加权,平衡不同时间段的峰值差异:

# 修改原函数,先收集所有峰值和比例
def create_scatter_plot(matrix, electrode_names, calculate_distance, positions_df, threshold, min_values):
    n_rows, n_columns = matrix.shape
    
    normalized_intensity_diffs = []
    normalized_distances = []
    column_max_intensities = []
    
    for i in range(n_columns):
        column = matrix[:, i]
        above_threshold = column > threshold
        if np.sum(above_threshold) < min_values:
            continue
        
        max_intensity_index = np.argmax(column)
        max_intensity = column[max_intensity_index]
        
        for j in range(n_rows):
            if j != max_intensity_index and above_threshold[j]:
                intensity_ratio = column[j]/max_intensity
                
                electrode_name1 = electrode_names[max_intensity_index]
                electrode_name2 = electrode_names[j]
                distance = calculate_distance(electrode_name1, electrode_name2, positions_df)
   
                normalized_intensity_diffs.append(intensity_ratio)
                normalized_distances.append(distance)
                column_max_intensities.append(max_intensity)
    
    # 计算全局峰值均值,加权调整比例
    global_mean_max = np.mean(column_max_intensities)
    weighted_intensities = [r * (global_mean_max / mi) for r, mi in zip(normalized_intensity_diffs, column_max_intensities)]
    
    plt.scatter(normalized_distances, weighted_intensities)
    plt.xlabel("Distance")
    plt.ylabel("Weighted Intensity Ratio")
    plt.show()
    return normalized_distances, weighted_intensities

4. 距离分箱内归一化

按距离区间分组,对每个区间内的强度值单独做归一化,保留不同距离段内的相对关系,避免全局归一化抹平局部规律:

# 在原函数末尾添加分箱归一化逻辑
import pandas as pd

df = pd.DataFrame({
    'distance': normalized_distances,
    'intensity_ratio': normalized_intensity_diffs
})
# 按距离分位数分箱,比如分5个区间
df['distance_bin'] = pd.qcut(df['distance'], q=5)
# 对每个箱内的强度比例做Min-Max归一化
df['normalized_intensity'] = df.groupby('distance_bin')['intensity_ratio'].transform(
    lambda x: (x - x.min())/(x.max() - x.min())
)

plt.scatter(df['distance'], df['normalized_intensity'])
plt.xlabel("Distance")
plt.ylabel("Bin-Normalized Intensity Ratio")
plt.show()

内容的提问来源于stack exchange,提问作者alpa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:19:55