假设我们对一个信号感兴趣,它是由三个不同信号源合成的:
import matplotlib.pyplot as plt
import mglearn
S=mglearn.datasets.make_signals()
plt.figure(figsize=(6,1))
plt.plot(S,'-')
plt.xlabel('Time')
plt.ylabel('Signal')
plt.show()
不幸的是,我们无法观测到原始数据,只能观测到三个信号的叠加混合。我们想要将混合信号分解为原始分量。
假设我们有许多不同的方法来观测混合信号,每种方法都为我们提供了一系列的测量结果:
A=np.random.RandomState(0).uniform(size=(100,3))
X=np.dot(S,A.T)
print('shape of measurements:{}'.format(X.shape))
我们可以用NMF来还原这三个信号:
nmf=NMF(n_components=3,random_state=42)
S_=nmf.fit_transform(X)
print('Recoveres signal shape:{}'.format(S_.shape))
为了对比,应用PCA,并对比NMF和PCA的信号活动:
pca=PCA(n_components=3)
H=pca.fit_transform(X)
models=[X,S,S_,H]
names=['Observations (first three measurements)',
'True sourse',
'NMF ','PCA ']
fig,axes=plt.subplots(4,figsize=(8,4),gridspec_kw={'hspace':.5},subplot_kw={'xticks':(),'yticks':()})
for model,name,ax in zip(models,names,axes):
ax.set_title(name)
ax.plot(model[:,:3],'-')
plt.show()
途中包含来自X 的100次测量里的3次用于参考。可以看到,NMF在发现原始信号源时得到了不错的结果,而PCA则失败了。要记住,NMF生成的分量是没有顺序的。