Python 使用FLD中的heighest特征值投影二维数据的多个簇

Python 使用FLD中的heighest特征值投影二维数据的多个簇,python,machine-learning,math,statistics,dimensionality-reduction,Python,Machine Learning,Math,Statistics,Dimensionality Reduction,我有4个大小为5x5的矩阵,其中五行(5xn)是数据点,列(nx5)是特征。具体如下: datapoint_1_class_A = np.asarray([(216, 236, 235, 230, 229), (237, 192, 191, 193, 199), (218, 189, 191, 192, 193), (201, 239, 230, 229, 220), (237, 210, 200, 236, 235)]) datapoint_2_class_A = np.asarray([(2

我有4个大小为5x5的矩阵,其中五行(5xn)是数据点,列(nx5)是特征。具体如下:

datapoint_1_class_A = np.asarray([(216, 236, 235, 230, 229), (237, 192, 191, 193, 199), (218, 189, 191, 192, 193), (201, 239, 230, 229, 220), (237, 210, 200, 236, 235)])
datapoint_2_class_A = np.asarray([(202, 202, 201, 203, 204), (210, 211, 213, 209, 208), (203, 206, 202, 201, 199), (201, 207, 206, 199, 205), (190, 191, 192, 193, 194)])

datapoint_1_class_B = np.asarray([(236, 237, 238, 239, 240), (215, 216, 217, 218, 219), (201, 202, 203, 209, 210), (240, 241, 243, 244, 245), (220, 221, 222, 231, 242)])
datapoint_2_class_B = np.asarray([(242, 243, 245, 246, 247), (248, 249, 250, 251, 252), (210, 203, 209, 210, 211), (247, 248, 249, 250, 251), (230, 231, 235, 236, 240)])
前两个矩阵属于A类,后两个矩阵属于B类

我通过计算矩阵内的散射(Sw)和矩阵间的散射(Sb),然后提取特征值和特征向量来最大化它们的分离

然后,在计算之后,我获得以下特征向量和特征值:

[(6551.009980205623, array([-0.4   ,  0.2531,  0.2835, -0.6809,  0.4816])), 
 (796.0735165617085, array([-0.4166, -0.4205,  0.6121, -0.2403,  0.4661])), 
 (4.423499174324943, array([ 0.1821, -0.1644,  0.7652, -0.2183, -0.5538])), 
 (1.4238024863819319, array([ 0.0702, -0.5216,  0.3792,  0.5736, -0.5002])), 
 (0.07624674030991384, array([ 0.2903, -0.2902,  0.2339, -0.73  ,  0.4938]))]
之后,我将W矩阵乘以初始20x5矩阵:

我的W矩阵给出了以下矩阵:

矩阵W:

 [[-0.4,   -0.4166]
 [ 0.2531, -0.4205]
 [ 0.2835,  0.6121]
 [-0.6809, -0.2403]
 [ 0.4816,  0.4661]]

X_lda = X.dot(W)
并绘制我的数据

from matplotlib.pyplot import figure
plt.xlabel('LD1')
plt.ylabel('LD2')
plt.scatter(
    X_lda.iloc[:,0],
    X_lda.iloc[:,1],
    c=['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red'],
    cmap='rainbow',
    alpha=1,
    edgecolors='w'
)
这个图的问题是数据没有很好地聚集和分离,我希望每个矩阵的数据点都聚集在一起,这就是我从上面的代码中得到的:


根据绘图轴,这些数据看起来没有很好的聚集,其中X轴和y轴分别为5和-5。我的目标是使用两个最高的特征值:
6551.009980205623、796.0735165617085
在一个特征空间(plot)内绘制我的数据,该特征空间正好是一个簇大小(5x5),因此轴分别为5、5 in X和y,簇内的每个点彼此相邻且距离很大。

在我看来,这类似于奇异值分解,它试图通过保留最能捕获数据传播的特征向量,将高维空间压缩为更小维空间

这是一种流行的策略,但也有其局限性:仅考虑高维空间向低维空间的投影,必然无法考虑高维表示中存在的微妙空间关系

一种流行的替代方法是t-sne,它使用损失函数迭代优化,以保持低维表示的高维数据中的“紧密性”


但最终,当使用任何聚类算法时,您只能得到数据中实际存在的分离,而不是您想要的分离。完全有可能的是,不管你的表现如何,你最终会得到你不满意的分组,仅仅因为这些分组不存在于你的高维表现中。

首先,你的矩阵计算中有一些错误。您有4个类(datapoint_1_class_A、datapoint_2_class_A、datapoint_1_class_B、datapoint_2_class_B),因此
W
的排名可能最多为3。你的军衔已经满了,这是不可能的。最后两个特征值应在1e-15左右

接下来,您可能已经混合了特征和点维度。请确保
X
的每一行对应于点。运行一个简单的检查:对于每个集群,找到它的平均值(通过每个列/特征)。将此点添加到集群。这将使你的矩阵由5个特征组成6个点。现在,再找出平均值。你应该得到完全相同的结果

请参阅以下代码:

import numpy as np
from matplotlib import pyplot as plt
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
a1 = np.asarray([(216, 236, 235, 230, 229), (237, 192, 191, 193, 199), (218, 189, 191, 192, 193), (201, 239, 230, 229, 220), (237, 210, 200, 236, 235)])
a2 = np.asarray([(202, 202, 201, 203, 204), (210, 211, 213, 209, 208), (203, 206, 202, 201, 199), (201, 207, 206, 199, 205), (190, 191, 192, 193, 194)])

b1 = np.asarray([(236, 237, 238, 239, 240), (215, 216, 217, 218, 219), (201, 202, 203, 209, 210), (240, 241, 243, 244, 245), (220, 221, 222, 231, 242)])
b2 = np.asarray([(242, 243, 245, 246, 247), (248, 249, 250, 251, 252), (210, 203, 209, 210, 211), (247, 248, 249, 250, 251), (230, 231, 235, 236, 240)])

X = np.vstack([a1.T, a2.T, b1.T, b2.T])
y = [1]*5 + [2]*5 + [3]*5 + [4]*5
clf = LinearDiscriminantAnalysis(n_components=2)
clf.fit(X, y)

Xem = clf.transform(X)
plt.scatter(Xem[0:5,0], Xem[0:5,1], c='b', marker='o')
plt.scatter(Xem[5:10,0], Xem[5:10,1], c='b', marker='s')
plt.scatter(Xem[10:15,0], Xem[10:15,1], c='r', marker='o')
plt.scatter(Xem[15:20,0], Xem[15:20,1], c='r', marker='s')

这导致以下结果:

数据点1级A和数据点2级A之间有什么区别?为什么不把它们合并成一个十行的矩阵呢?为什么有两个不同的线性判别式呢?使用什么数据来计算单独的LDs?我的假设是,您正在寻找一个LD来最好地将a类和B类分开。您是否真的希望将这四个数据集彼此分开?在这种情况下,您应该使用
n*(n-1)/2==6
LDs,而不是
2
。好的,为了更好地理解,我更改了名称。目标是在同一维度空间(即2D空间)内对两个簇A和簇B进行分类。我们有0类和1类,其中A类和B类需要线性鉴别器来分离它们的类。最终,我将得到需要对类0和1进行区分的集群C,对于集群D和任何新的其他集群也会发生同样的事情。它们将始终具有相同数量的数据点和相同的维度。对于用于计算其可分性的数据,其可分性是矩阵内散布的每个数据点的标准偏差之和,而对于矩阵之间的散布,则使用每个数据点的平均值之和。其中,在找到一个数据点的标准偏差后,需要将其乘以所有数据点的倒数,然后将结果相加,与平均值计算的过程相同,然后通过解决一般化问题来找到特征值/特征向量。你能用我的数据点展示一下这个算法的一个小例子吗?我认为这可能是一个很好的选择,尽管这不是我想要的,今晚有点晚了,但我有我自己的问题,我想问你,所以我会看看明天我是否能做点什么。因为我在看视频,它不会最大化分离,这终究是行不通的。对只有两个类的多个聚类使用FLD的诀窍在于将标准偏差相加,即类内的离散度,并与它们的均值之和(即聚类中心)进行比较,视频基本上解释了您所说的,它不会提高可分性,只给出它是什么。我很好奇为什么你试图根据一个特定的标签对数据进行聚类,你想得到什么作为最终结果?看起来你要做的是定义一个空间变换,它更像一个分类工具?为了简化您所说的,您似乎在计算一个转换,以夸大存在于高d空间已知区域中的数据集之间的分离。这似乎是合理的,但根据我在分类方面的经验,“亲密”的概念通常比“远”更有用,但我认为d