點擊上面"腦機接口社區"關注我們
更多技術乾貨第一時間送達
Hello,大家好!
Rose今天分享一下CCA的相關原理以及Python應用,CCA在EEG等腦電數據的特徵提取中使用很多,很有必要熟悉其原理。
CCA典型相關分析
CCA(canonical correlation analysis)利用綜合變量對之間的相關關係來反映兩組指標之間的整體相關性的多元統計分析方法。它的基本原理是:爲了從總體上把握兩組指標之間的相關關係,分別在兩組變量中提取有代表性的兩個綜合變量U1和V1(分別爲兩個變量組中各變量的線性組合),利用這兩個綜合變量之間的相關關係來反映兩組指標之間的整體相關性。
1936年,Hotelling提出典型相關分析。考慮兩組變量的線性組合, 並研究它們之間的相關係數p(u,v).在所有的線性組合中, 找一對相關係數最大的線性組合, 用這個組合的單相關係數來表示兩組變量的相關性, 叫做兩組變量的典型相關係數, 而這兩個線性組合叫做一對典型變量。在兩組多變量的情形下, 需要用若干對典型變量才能完全反映出它們之間的相關性。下一步, 再在兩組變量的與u1,v1不相關的線性組合中, 找一對相關係數最大的線性組合, 它就是第二對典型變量, 而且p(u2,v2)就是第二個典型相關係數。這樣下去, 可以得到若干對典型變量, 從而提取出兩組變量間的全部信息。
典型相關分析的實質就是在兩組隨機變量中選取若干個有代表性的綜合指標(變量的線性組合), 用這些指標的相關關係來表示原來的兩組變量的相關關係。這在兩組變量的相關性分析中, 可以起到合理的簡化變量的作用; 當典型相關係數足夠大時, 可以像迴歸分析那樣, 由- 組變量的數值預測另一組變量的線性組合的數值。
原理描述
案例實現
# 導入工具包
import h5py
import rcca
import sys
import numpy as np
import cortex
zscore = lambda d: (d-d.mean(0))/d.std(0)
第一步:加載數據
請從CRCNS下載數據:http://crcns.org/data-sets/vc/vim-2以下分析假定該數據位於當前目錄中名爲“ data”的目錄中。
data = []
vdata = []
numSubjects = 3
# subjects 是3個受試者列表.
subjects = ['S1', 'S2', 'S3']
# xfms 是Pycortex中變換名稱的列表,該名稱用於對齊每個受試者的功能和解剖數據。
xfms = ['S1_xfm', 'S2_xfm', 'S3_xfm']
dataPath ="./data/VoxelResponses_subject%d.mat"
for subj in range(numSubjects):
# 打開數據
f = h5py.File(dataPath % (subj+1),'r')
# 獲取數據大小
datasize = (int(f["ei"]["datasize"].value[2]),int(f["ei"]["datasize"].value[1]),int(f["ei"]["datasize"].value[0]))
# 從Pycortex獲取皮質面罩
mask = cortex.db.get_mask(subjects[subj], xfms[subj], type = 'thick')
# 獲取該受試者的訓練數據
data_subj = np.nan_to_num(zscore(np.nan_to_num(f["rt"].value.T)))
data.append(data_subj.reshape((data_subj.shape[0],)+datasize)[:, mask])
# 獲取受試者的驗證數據
vdata_subj = np.nan_to_num(zscore(np.nan_to_num(f["rv"].value.T)))
vdata.append(vdata_subj.reshape((vdata_subj.shape[0],)+datasize)[:, mask])
第二步:定義CCA參數
# 這裏設置1e-4和1e2之間的一系列正則化值
regs = np.array(np.logspace(-4, 2, 10))
# 這裏考慮3到10之間的成分數量
numCCs = np.arange(3, 11)
# 初始化cca模型
cca = rcca.CCACrossValidate(numCCs=numCCs, regs=regs)
第三步:對數據訓練,分析並保存分析結果
"""
說明:
由於數據量大,此分析的計算量很大。
在筆記本中運行它會花費大量時間,因此建議對其進行並行化和/或在計算機羣集上運行它,然後加載結果以進行可視化。
"""
# 利用cca訓練數據
cca.train(data)
# 利用cca對驗證數據進行驗證
cca.validate(vdata)
# 計算方差,解釋每個體素中的驗證響應
cca.compute_ev(vdata)
# 保存分析結果
cca.save("./data/CCA_results.hdf5")
第四步:可視化分析結果
# 導入可視化工具包
%matplotlib inline
import matplotlib.pyplot as plt
# 導入Brewer色彩圖以進行可視化
from brewer2mpl import qualitative
nSubj = len(cca.corrs)
nBins = 30
bmap = qualitative.Set1[nSubj]
f = plt.figure(figsize = (8, 6))
ax = f.add_subplot(111)
for s in range(nSubj):
# 繪製所有三個對象的所有體素之間的相關性直方圖
ax.hist(cca.corrs[s], bins = nBins, color = bmap.mpl_colors[s], histtype="stepfilled", alpha = 0.6)
plt.legend(['Subject 1', 'Subject 2', 'Subject 3'], fontsize = 16)
ax.set_xlabel('Prediction correlation', fontsize = 20)
ax.set_ylabel('Number of voxels', fontsize = 20)
ax.set_title("Prediction performance across voxels", fontsize = 20)
# p <0.05時的顯着性閾值(針對多次比較進行了校正)
# 重要性是使用漸近方法計算的(有關詳細信息,請參見論文文本)
thresh = 0.0893
ax.axvline(x = thresh, ymin = 0, ymax = 7000, linewidth = 2, color = 'k')
ax.text(thresh+0.05, 5000, 'p<0.05', fontsize = 16)
ax.set_xticklabels(0.1*np.arange(-8, 11, 2), fontsize = 16)
ax.set_yticklabels(np.arange(0, 10000, 1000), fontsize = 16)
該圖顯示了皮質圖上一個對象的跨學科預測結果,即預測的驗證響應和實際的驗證響應之間的相關性。不重要的相關性(p <0.05,已針對多個比較進行校正)設置爲0。
import cortex
from matplotlib import cm
from copy import deepcopy
subj = 0
subjName = "S1"
subjTransform = "S1_xfm"
corrs = deepcopy(cca.corrs[subj])
# 將所有低於顯着性閾值的體素設置爲0
corrs[corrs<thresh] = 0
_ = cortex.quickflat.make_figure(cortex.Volume(corrs, subjName,
subjTransform,
cmap = cm.PuBuGn_r,
vmin = 0., vmax = 1.), with_curvature = True)
參考:
https://www.cnblogs.com/jerrylead/archive/2011/06/20/2085491.html
https://github.com/gallantlab/pyrcca
文章用於學術交流,不用於商業行爲,若有侵權及疑問,請後臺留言!
更多閱讀
腦機接口BCI學習交流QQ羣:903290195
微信羣請掃碼添加,Rose拉你進羣
(請務必填寫備註,eg. 姓名+單位+專業/領域/行業)
長按加羣
歡迎點個在看鼓勵一下