没有标签信息的数据点如何分类?
How do I classify data points without label information?
我还有一个问题。分类准确率?
我会先解决你的最后一点,以解决它。如果您不知道 classification 标签的开头,则无法评估 classification 的准确性。如果您不知道 开头的标签是什么,您如何知道 C
或 D
中的点是否分配了正确的标签?在那种情况下,我们将不得不不管它。
但是,您可以计算在矩阵 C
和 D
中被 class 化为 A
或 B
的值的百分比] 了解样本在两者中的分布。具体来说,如果例如在矩阵 C
中,大多数样本被 class 确定为属于矩阵 A
定义的组,那么这可能很好地表明 C
在分布上非常像A
。
无论如何,我可以建议您 class确定 C
或 D
中的哪些点属于 A
或 B
就是使用k
-nearest neighbours algorithm。具体来说,您有一堆源数据点,即那些属于矩阵 A
和 B
的数据点,其中 A
和 B
有自己的标签。在您的例子中,A
中的样本被分配了标签 1,B
中的样本被分配了标签 -1。要确定未知点属于某个组的哪个位置,您可以简单地在特征 space 中找到该点与 A
和 B
中的所有值之间的距离。 A
或 B
中的哪个点与未知点最近,那么该点在源点中属于哪个组,就是您将应用于该未知点的组。
因此,只需将 C
和 D
连接成一个 N x 1000
矩阵,将 k
最近邻应用到另一个连接矩阵 A
和 B
并找出它在另一个串联矩阵中最接近的点。然后,读出标签是什么,这会给你未知点的标签可能是什么。
在 MATLAB 中,使用 knnsearch
function that's part of the Statistics Toolbox. However, I encourage you to take a look at my previous post on explaining the k
-nearest neighbour algorithm here: 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
returns sourcePoints
中与查询点最匹配的源点的 行 位置。因此,输出的每个值都会告诉您源点矩阵中的哪个点与该特定查询点最匹配。最终,这个 returns 我们需要在标签数组中找到实际标签的位置。
因此,如果您想查看为 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
的标签
每个案例我都放置了不同的颜色,但使用相同的标记来表示每个点属于哪个 class:x
组 A
和 o
对于组 B
.
我会留给你将其扩展到三个维度。
我还有一个问题。分类准确率?
我会先解决你的最后一点,以解决它。如果您不知道 classification 标签的开头,则无法评估 classification 的准确性。如果您不知道 开头的标签是什么,您如何知道 C
或 D
中的点是否分配了正确的标签?在那种情况下,我们将不得不不管它。
但是,您可以计算在矩阵 C
和 D
中被 class 化为 A
或 B
的值的百分比] 了解样本在两者中的分布。具体来说,如果例如在矩阵 C
中,大多数样本被 class 确定为属于矩阵 A
定义的组,那么这可能很好地表明 C
在分布上非常像A
。
无论如何,我可以建议您 class确定 C
或 D
中的哪些点属于 A
或 B
就是使用k
-nearest neighbours algorithm。具体来说,您有一堆源数据点,即那些属于矩阵 A
和 B
的数据点,其中 A
和 B
有自己的标签。在您的例子中,A
中的样本被分配了标签 1,B
中的样本被分配了标签 -1。要确定未知点属于某个组的哪个位置,您可以简单地在特征 space 中找到该点与 A
和 B
中的所有值之间的距离。 A
或 B
中的哪个点与未知点最近,那么该点在源点中属于哪个组,就是您将应用于该未知点的组。
因此,只需将 C
和 D
连接成一个 N x 1000
矩阵,将 k
最近邻应用到另一个连接矩阵 A
和 B
并找出它在另一个串联矩阵中最接近的点。然后,读出标签是什么,这会给你未知点的标签可能是什么。
在 MATLAB 中,使用 knnsearch
function that's part of the Statistics Toolbox. However, I encourage you to take a look at my previous post on explaining the k
-nearest neighbour algorithm here: 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
returns sourcePoints
中与查询点最匹配的源点的 行 位置。因此,输出的每个值都会告诉您源点矩阵中的哪个点与该特定查询点最匹配。最终,这个 returns 我们需要在标签数组中找到实际标签的位置。
因此,如果您想查看为 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
的标签
每个案例我都放置了不同的颜色,但使用相同的标记来表示每个点属于哪个 class:x
组 A
和 o
对于组 B
.
我会留给你将其扩展到三个维度。