Python 使用FLD中的heighest特征值投影二维数据的多个簇
我有4个大小为5x5的矩阵,其中五行(5xn)是数据点,列(nx5)是特征。具体如下: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
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