我将首先解决您的最后一点,以免妨碍它。如果您不知道分类标签是从什么开始的,那么就无法评估分类准确性。你怎么知道正确的标签是否被分配给C或D中的点如果你不知道它是从什么标签开始?在这种情况下,我们将不得不放弃它。
但是,您可以做的是计算矩阵 C 和 D 中被分类为 A 或 B 的值的百分比,以了解它们两者中的样本分布情况。具体来说,如果例如在矩阵C 中,大多数样本被分类为属于矩阵A 定义的组,那么这可能很好地表明C 在分布中非常类似于A .
无论如何,我可以建议您分类C 或D 中的哪些点属于A 或B 是使用k-nearest neighbours algorithm。具体来说,您有一堆源数据点,即属于矩阵A 和B 的源数据点,其中A 和B 有自己的标签。在您的情况下,A 中的样本被分配标签 1,B 中的样本被分配标签 -1。要确定一个未知点属于某个组的位置,您可以简单地使用A 和B 中的所有值在特征空间中找到该点之间的距离。 A 或 B 中与未知点最接近的任何点,然后该点属于源点中的任何组,这就是您将应用于此未知点的组。
因此,只需将C 和D 连接成一个N x 1000 矩阵,将k-最近邻应用到另一个带有A 和B 的连接矩阵,并找出它最近的点在这个其他级联矩阵中。然后,读出标签是什么,这会给你未知点的标签可能是什么。
在 MATLAB 中,使用统计工具箱中的 knnsearch 函数。不过,我鼓励你看看我之前关于解释k-最近邻算法的帖子:Finding K-nearest neighbors and its implementation
无论如何,假设 A、B、C 和 D 已定义,您将如何应用我上面所说的内容:
labels = [ones(size(A,1),1); -ones(size(B,1),1)]; %// Create labels for A and B
%// Create source and query points
sourcePoints = [A; B];
queryPoints = [C; D];
%// Perform knnsearch
IDX = knnsearch(sourcePoints, queryPoints);
%// Extract out the groups per point
groups = labels(IDX);
groups 将包含与queryPoints 提供的每个点相关联的标签。 knnsearch 返回sourcePoints 中与查询点最匹配的源点的行 位置。因此,输出的每个值都会告诉您源点矩阵中的哪个点与该特定查询点最匹配。最终,这会返回标签数组中我们需要的位置,以确定实际标签是什么。
因此,如果您想查看为C 中的点分配了哪些标签,您可以这样做:
labelsC = groups(1:size(C,1));
labelsD = groups(size(C,1)+1:end);
因此,在labelsC 和labelsD 中,它们包含为两个矩阵中的每个未知点分配的标签。任何值为 1 表示特定点类似于矩阵 A 中的点。同样,任何值为 -1 的值都意味着特定点类似于矩阵 B 中的点。
如果您想将所有这些都绘制在一起,只需将您在上一个问题中所做的与您在此问题中的新数据结合起来:
%// Code as before
[coeffA, scoreA] = pca(A);
[coeffB, scoreB] = pca(B);
numDimensions = 2;
scoreAred = scoreA(:,1:numDimensions);
scoreBred = scoreB(:,1:numDimensions);
%// New - Perform dimensionality reduction on C and D
[coeffC, scoreC] = pca(C);
[coeffD, scoreD] = pca(D);
scoreCred = scoreC(:,1:numDimensions);
scoreDred = scoreD(:,1:numDimensions);
%// Plot the data
plot(scoreAred(:,1), scoreAred(:,2), 'rx', scoreBred(:,1), scoreBred(:,2), 'bo');
hold on;
plot(scoreCred(labelsC == 1,1), scoreCred(labelsC == 1,2), 'gx', ...
scoreCred(labelsC == -1,1), scoreCred(labelsC == -1,2), 'mo');
plot(scoreDred(labelsD == 1,1), scoreDred(labelsD == 1,2), 'kx', ...
scoreDred(labelsD == -1,1), scoreDred(labelsD == -1,2), 'co');
以上是二维的情况。我们绘制了A 和B,它们的尺寸减小到2。类似地,我们将PCA 应用于C 和D,然后将所有内容绘制在一起。第一行通常绘制A 和B。接下来,我们必须使用hold on;,以便我们可以多次调用plot 并将结果附加到同一个图形。我们必须四次调用plot 来说明四种不同的组合:
- 矩阵
C 具有来自A 的标签
- 矩阵
C 具有来自B 的标签
- 矩阵
D 具有来自A 的标签
- 矩阵
D 具有来自B 的标签
每个案例我都放置了不同的颜色,但使用相同的标记来表示每个点属于哪个类:x 用于组A 和o 用于组B。
我将把它扩展到三个维度。