我正在尝试查找数据集中的独立组件,将它们绘制出来,然后对每个组件的点进行2次细分。
我正在使用scikit-learn,并创建了一个数据集。然后,我在其上使用FastICA()并获得了包含我的组件的混合矩阵。 但是现在我不知道如何继续。我以为也许可以用线性回归来解决它,但是我需要两行。因此,我想到了选择组件的最大和最小点以及它们之间的拟合线的方法,但是也没有任何提示! 如果可以找到这些线,则可以计算到每个点的欧几里得距离,因此我将知道哪个点属于哪个分量。 但是当我尝试绘制它们时,它们看起来是错误的。
# example data set
n_samples = 1000
# random n-class classification problem
X, Y = make_classification(n_samples=n_samples, n_features=2, n_redundant=0, n_informative=2,
n_clusters_per_class=1, n_classes=2, random_state=42)
fig = plt.figure(figsize=(7,7))
plt.scatter(X[:, 0], X[:, 1], c = 'red', s=30, edgecolor='k')
plt.title("Synthetic Data Set")
plt.show()
ica = FastICA(random_state=3)
X_ica = ica.fit_transform(X) # Reconstruct signals
X_ica /= X_ica.std() # Compute the standard deviation
A = ica.mixing_
print(A)
plt.figure(figsize=(7,7))
def plot_samples(X, axis):
plt.scatter(X[:, 0], X[:, 1], c = 'orange', s=30, edgecolor='k')
axis /= axis.std()
x_axis, y_axis = axis
# Trick to get legend to work
plt.plot(linewidth=2, color='red')
plt.quiver(2, 0, x_axis, y_axis, zorder=11, width=0.01, scale=5, color='red')
plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.xlabel('x')
plt.ylabel('y')
plot_samples(X / np.std(X), A / A.std())
plt.plot()
plt.title('Observations with ICA')
plt.show()
我希望独立分量实际上会经历最大和第二大方差,但是正如您所看到的那样,它们会失真。