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
相关产品推荐
相关产品推荐

