【火爐煉AI】機器學習054-用ICA做盲源分離
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
盲源分離是指在信號的理論模型和源信號無法精確獲知的情況下捉片,如何從混疊信號中分離出各源信號的過程簇秒。盲源分離的目的是求得源信號的最佳估計姿锭。說的通俗一點,就相當于嚼锄,假如有十個人同時說話凡蜻,我用錄音機把他們說的話都錄下來件豌,得到的肯定是10種聲音的混雜战得,那么怎么將這種混雜聲音分離成單個人的說話聲音?解決類似這種問題就是盲源分離悍募。
獨立成分分析(Independent Components Analysis, ICA)解決的是原始數(shù)據(jù)分解的問題蘑辑,常常用于盲源分離問題中。在我上一篇文章【火爐煉AI】機器學習053-數(shù)據(jù)降維絕招-PCA和核PCA中提到PCA雖然具有各種優(yōu)點坠宴,但是也有幾個缺點洋魂,比如不能對非線性組織的數(shù)據(jù)集降維,針對這個缺點解決方法是用核PCA代替PCA桐玻,另外一個缺點是不能用于解決數(shù)據(jù)集不滿足高斯分布的情況蹋宦,這種情況的數(shù)據(jù)降維要用獨立成分分析ICA來完成。
獨立成分分析師從多維統(tǒng)計數(shù)據(jù)中尋找潛在因子或成分的一種方法脖含,ICA與PCA等降維方法的區(qū)別在于豁翎,它尋找滿足統(tǒng)計獨立和非高斯的成分角骤。其數(shù)學原理和邏輯可以參考博文:獨立成分分析ICA系列2:概念、應用和估計原理
1. 加載數(shù)據(jù)集
首先加載數(shù)據(jù)集心剥,本次所用的數(shù)據(jù)集位于文件mixture_of_signals.txt中启搂,這個文件中有四列數(shù)據(jù),代表四個不同的信號源刘陶,共2000個樣本
data_path="E:\PyProjects\DataSet\FireAI\mixture_of_signals.txt"
df=pd.read_csv(data_path,header=None,sep=' ')
print(df.info()) # 查看數(shù)據(jù)信息,確保沒有錯誤
print(df.head())
print(df.tail())
dataset_X=df.values
print(dataset_X.shape)
繪圖后牢撼,可以看出這些數(shù)據(jù)的分布情況:
2. 用傳統(tǒng)PCA來分離信號
假如我們用PCA來進行盲源分離匙隔,可以看看效果怎么樣,代碼為:
# 如果用PCA來進行分離熏版,看看結果如何
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca_dataset_X = pca.fit_transform(dataset_X)
pd.DataFrame(pca_dataset_X).plot(title='PCA_dataset')
上面雖然繪制了PCA分離之后的各種信號纷责,但是信號夾雜在一起難以分辨,故而我編寫了一個函數(shù)將其分開顯示
def plot_dataset_X(dataset_X):
rows,cols=dataset_X.shape
plt.figure(figsize=(15,20))
for i in range(cols):
plt.subplot(cols,1,i+1)
plt.title('Signal_'+str(i))
plt.plot(dataset_X[:,i])
3. 用ICA來分離信號
下面看看用獨立成分分析方法得到的分離后信號:
# 如果用ICA進行信號分離
from sklearn.decomposition import FastICA
ica = FastICA(n_components=4)
ica_dataset_X = ica.fit_transform(dataset_X)
pd.DataFrame(ica_dataset_X).plot(title='ICA_dataset')
同理撼短,為了顯示方便再膳,將各種信號單獨畫圖,如下:
可以看出曲横,經(jīng)過ICA分離之后得到的信號非常有規(guī)律喂柒,而PCA分離后的信號有些雜亂,表面ICA的盲源分離效果較好禾嫉。
########################小**********結###############################
1灾杰,用ICA可以解決盲源分離問題,所得到的分離效果要比PCA要好得多熙参。
2艳吠,實際上,生活中的真實數(shù)據(jù)集大部分都不是服從高斯分布孽椰,它們一般服從超高斯分布或亞高斯分布昭娩,故而很多問題用PCA得到的效果不太理想,返回用ICA能夠得到比較好的結果黍匾。
#################################################################
注:本部分代碼已經(jīng)全部上傳到(我的github)上栏渺,歡迎下載。
參考資料:
1, Python機器學習經(jīng)典實例膀捷,Prateek Joshi著迈嘹,陶俊杰,陳小莉譯