時(shí)常我們能看到科幻中讀取他人意念的場(chǎng)景,讓人感覺(jué)很玄幻。那么現(xiàn)代科技真的可以做到這一點(diǎn)么舞萄?答案是在特定情況下可以以一個(gè)比較高的準(zhǔn)確率識(shí)別人的想法。別擔(dān)心管削,不是大街上隨隨便便注視著你就可以識(shí)別出來(lái)的倒脓,是通過(guò)對(duì)腦電信號(hào)的分析,使用小波變換和支持向量機(jī)的現(xiàn)代科學(xué)方法含思,在指定的幾種類別中識(shí)別出你想的具體是哪一例崎弃。
首先選定十二個(gè)類別的圖片,包括動(dòng)物含潘、花饲做、交通工具等,然后讓十名受試者觀測(cè)這些圖片遏弱,每張圖片觀測(cè)0.9秒盆均,休息0.7秒再觀測(cè)下一張,并在這一過(guò)程中采集受試者的19通道腦電漱逸。
特征提取
將采集到的腦電信號(hào)經(jīng)過(guò)1-30HZ帶通濾波泪姨、獨(dú)立成分分析去除眨眼等肌肉運(yùn)動(dòng)的信號(hào),進(jìn)行高低頻濾波饰抒,然后在進(jìn)行降采樣肮砾,就可以得到近似系數(shù)(approximation coefficient)和細(xì)節(jié)系數(shù)(detail coefficient)。在特提取中循集,使用了五級(jí)小波變換唇敞,在Daubechies4蔗草,Haar咒彤,和Symlet2三種小波變換方法在下獲得了受試者在觀測(cè)一幅圖的過(guò)程中6000~7000個(gè)特征疆柔。隨后使用T test, Entropy,和 Bhattacharyya distance三種方式進(jìn)行特征提取,獲得最重要的1000個(gè)特征镶柱。
在Matlab中可以進(jìn)行這種小波分解的計(jì)算旷档,以獲得近似系數(shù)和細(xì)節(jié)系數(shù),這里使用Matlab自帶的3天的電功耗信號(hào)進(jìn)行了DB4小波五層分解歇拆,可以直觀的看到近似系數(shù)和五層細(xì)節(jié)信息鞋屈。具體代碼和結(jié)果如下:
clear;
load leleccum
s = leleccum(1:3920);
l_s = length(s);
[C,L] = wavedec(s,5,'db4');
cA5 = appcoef(C,L,'db4',5);
cD5 = detcoef(C,L,5);
cD4 = detcoef(C,L,4);
cD3 = detcoef(C,L,3);
cD2 = detcoef(C,L,2);
cD1 = detcoef(C,L,1);
A5 = wrcoef('a',C,L,'db4',3);
D1 = wrcoef('d',C,L,'db4',1);
D2 = wrcoef('d',C,L,'db4',2);
D3 = wrcoef('d',C,L,'db4',3);
D4 = wrcoef('d',C,L,'db4',4);
D5 = wrcoef('d',C,L,'db4',5);
A0 = waverec(C,L,'db4');
subplot(2,3,1); plot(A5);
title('Approximation A5')
subplot(2,3,2); plot(D1);
title('Detail D1')
subplot(2,3,3); plot(D2);
title('Detail D2')
subplot(2,3,4); plot(D3);
title('Detail D3')
subplot(2,3,5); plot(D4);
title('Detail D4')
subplot(2,3,6); plot(D5);
title('Detail D5')
figure;
subplot(3,1,1);plot(s);title('Original'); axis off
subplot(3,1,2);plot(A5);title('Level 5 Approximation');axis off
subplot(3,1,3);plot(A0);title('Revivification'); axis off
支持向量機(jī)分類
支持向量機(jī)(Support Vector Machine)是在分類與回歸分析中分析數(shù)據(jù)的監(jiān)督式學(xué)習(xí)模型與相關(guān)的學(xué)習(xí)算法。給定一組訓(xùn)練實(shí)例故觅,每個(gè)訓(xùn)練實(shí)例被標(biāo)記為屬于兩個(gè)類別中的一個(gè)或另一個(gè)厂庇,SVM訓(xùn)練算法創(chuàng)建一個(gè)將新的實(shí)例分配給兩個(gè)類別之一的模型,使其成為非概率二元線性分類器输吏。SVM模型是將實(shí)例表示為空間中的點(diǎn)权旷,這樣映射就使得單獨(dú)類別的實(shí)例被盡可能寬的明顯的間隔分開(kāi)。然后贯溅,將新的實(shí)例映射到同一空間拄氯,并基于它們落在間隔的哪一側(cè)來(lái)預(yù)測(cè)所屬類別。
SVM需要進(jìn)行參數(shù)選取它浅,該實(shí)驗(yàn)中使用了遍歷的方法進(jìn)行兩個(gè)參數(shù)的選取译柏,而在論文中使用的是C和σ,而Python中使用的是C和Gamma姐霍,σ和Gamma有如下對(duì)應(yīng)關(guān)系鄙麦。
其中C是懲罰系數(shù),即對(duì)誤差的寬容度镊折。C越高黔衡,說(shuō)明越不能容忍出現(xiàn)誤差,容易過(guò)擬合腌乡。C越小盟劫,容易欠擬合。Gamma為單個(gè)樣本對(duì)整個(gè)分類超平面的影響与纽,當(dāng)Gamma比較小時(shí)侣签,單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較大,更容易被選擇為支持向量急迂,反之影所,當(dāng)Gamma比較大時(shí),單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較小僚碎,不容易被選擇為支持向量猴娩。
不同受試者存在差異性,每個(gè)人的最佳參數(shù)不同,下圖展現(xiàn)的是受試者一的grid-search結(jié)果卷中,C的最佳取值為1000矛双,σ的最佳取值為1。
SVM本身是一個(gè)二值分類器蟆豫,但該實(shí)驗(yàn)需要對(duì)受試者十二種腦電信號(hào)進(jìn)行分析议忽,進(jìn)而識(shí)別十二種類別的圖片。目前常用的方法有兩種:一對(duì)多法(one-versus-rest,簡(jiǎn)稱OVR SVMs)和一對(duì)一法(one-versus-one,簡(jiǎn)稱OVO SVMs或者pairwise)十减。一對(duì)多法是將一個(gè)作為正例栈幸,其他作為反例,如此構(gòu)建十二個(gè)分類器帮辟,最終的結(jié)果便是這十二個(gè)值中最大的一個(gè)作為分類結(jié)果速址。一對(duì)一法是將每?jī)蓚€(gè)種類構(gòu)建一個(gè)分類器,這樣十二分類便有六十六個(gè)分類器由驹,然后采取投票的形式壳繁,選取最大值。
文章中提到在三分類任務(wù)中荔棉,原始數(shù)據(jù)闹炉,未經(jīng)過(guò)小波變換的數(shù)據(jù)經(jīng)過(guò)SVM訓(xùn)練后只有32%準(zhǔn)確率,經(jīng)過(guò)sym2小波變換后的數(shù)據(jù)輸入到SVM準(zhǔn)確率提升為59%润樱,再經(jīng)過(guò)T test特征特征選取準(zhǔn)確率進(jìn)一步提升到87.3%渣触。而在十二分類任務(wù)中,三種小波變換和三種特征提取方式獲得識(shí)別準(zhǔn)確率大概在60%~70%壹若。
我們可以在Python中很方便的使用sklearn和內(nèi)置的安德森鳶尾花卉數(shù)據(jù)集來(lái)試驗(yàn)下SVM的分類效果嗅钻。該數(shù)據(jù)集是70多年前,加拿大加斯帕半島上店展,于同一天的同一個(gè)時(shí)間段养篓,使用相同的測(cè)量?jī)x器,在相同的牧場(chǎng)上由同一個(gè)人測(cè)量出來(lái)的三種花的四種特征赂蕴。
使用SVM對(duì)三種花進(jìn)行分類的代碼如下柳弄,運(yùn)行后在留一驗(yàn)證法的情況下獲得了98%準(zhǔn)確率「潘担可見(jiàn)SVM在小數(shù)據(jù)集上的分類效果確實(shí)還是很好的碧注。
from sklearn import datasets
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from numpy import *
def data_svc_test(data, target, index):
x_train = vstack((data[0: index], data[index + 1: -1]))
x_test = data[index]
y_train = hstack((target[0: index], target[index + 1: -1]))
y_test = target[index]
print(x_train)
print(y_train)
SVC_0 = SVC(kernel = 'rbf', gamma=0.25)
SVC_0.fit(x_train, y_train)
predict = SVC_0.predict(x_test)
return predict == y_test
# download the dataset
iris_dataset = datasets.load_iris()
iris_data = iris_dataset.data
iris_target = iris_dataset.target
length = iris_target.shape[0]
right = 0
for i in range(0, length):
right += data_svc_test(iris_data, iris_target, i)
# accuracy rate
print("%f%%" % (right * 100.0 / length))
總的來(lái)說(shuō),通過(guò)對(duì)腦電數(shù)據(jù)的采集糖赔,小波變換和SVM分類的方法萍丐,我們可以在不知道受試者觀測(cè)的是十二種圖片中的哪一類的同時(shí)猜測(cè)到受試者所觀測(cè)的是哪一類圖片,準(zhǔn)確率大概可以達(dá)到60%~70%放典。沒(méi)有科幻片中那么神奇逝变,但這一技術(shù)的研究可能能幫助諸如漸凍癥患者等病人基茵,讓計(jì)算機(jī)理解他們的意圖,改善他們的生活質(zhì)量壳影。
參考文獻(xiàn)
Taghizadehsarabi M, Daliri M R, Niksirat K S. Decoding objects of basic categories from electroencephalographic signals using wavelet transform and support vector machines.[J]. Brain Topography, 2015, 28(1):33-46.