基于测试点到每个类中点的平均距离的分类算法

机器算法验证 分类 scikit-学习 算法
2022-03-15 10:12:25

是否有任何分类算法可以为平均距离最小的点簇分配一个新的测试向量?

让我写得更好:假设我们有的集群。之间所有距离的平均值,其中是集群中的一个点。KTkx(0)x(i)x(i)k

测试点被分配给具有最小这种距离的集群。

你认为这是一个有效的分类算法吗?从理论上讲,如果集群在线性钓鱼判别映射之后是“格式良好的”,我们应该能够具有良好的分类精度。

你觉得这个算法怎么样?我已经尝试过,但结果是分类强烈偏向于元素数量最多的集群。

def classify_avg_y_space(logging, y_train, y_tests, labels_indices):
    my_labels=[]
    distances=dict()
    avg_dist=dict()
    for key, value in labels_indices.items():
        distances[key] = sk.metrics.pairwise.euclidean_distances(y_tests, y_train[value])
        avg_dist[key]=np.average(distances[key], axis=1)

    for index, value in enumerate(y_tests):
      average_distances_test_cluster = { key : avg_dist[key][index] for key in labels_indices.keys() }
      my_labels.append(min(average_distances_test_cluster, key=average_distances_test_cluster.get))
    return my_labels
1个回答

这是一个好主意,但有一个主要缺陷——它对数据的传播过于敏感。

为了澄清这个问题,给定个不相交的簇 ,您会问根据规则进行分类是否有意义kC1,,Ckx

argmini[k]1|Ci|xCixx

请注意,此规则确实类似于作为众所周知的算法存在的规则,例如实际上是 1-Nearest-Neighbors,或其中 in被调用,但被 k-Means 用于聚类分配,并且可以在 LDA 中在底层协方差的情况下看到矩阵是恒等式(最多为标量)。(请注意,一般而言,LDA 还考虑了簇的形状 [展开 + 方向])。

argmini[k]minxCixx
argmini[k]1|Ci|xCixx
sklearnNearestCentroid

在许多情况下,提议的规则的行为类似于NearestCentroid,特别是如果集群分离良好并且具有相似的方差(在这种情况下,我认为可以根据与质心的距离来限制平均距离)。

然而,由于它对集群中所有点的距离进行平均,它明显地偏向于低方差集群。我相信这是您注意到的错误标签的真正来源。

为了说明这种效果,我们可以绘制分类器的决策边界。剧情无耻地照着sklearn我的例子

在此处输入图像描述

在上图中,我从不同的正态分布生成了两个数据集。紫罗兰来自黄色来自然后,根据规则对空间中的每个点进行着色。分隔区域的线是决策边界。紫色簇中有 200 个点,黄色簇中有 50 个点。标记每个簇的质心。请注意,紫色簇未与轴​​对齐,以强调 LDA 和最近质心之间的差异。

N((03),(10221)2)
N((03),(1001))
+