寻找线性可分但未标记数据点的分类 (?) 算法

数据挖掘 分类 支持向量机 无监督学习
2021-09-24 04:53:09

我有一个可以用两条线线性分离的数据集 - 类似这样:

在此处输入图像描述

现在我正在寻找一种正确的算法来做我猜 SVM 会对标记数据做的事情——找到每个类的边距或决策边界(在这种情况下是三个)。我尝试了光谱聚类和高斯混合,但这些似乎不起作用。数据来源:三车道道路上汽车的跟踪边界框的边缘。谢谢!

编辑:K-Means 显然不适用于这种分布: 在此处输入图像描述

我还尝试了 Ismor 的建议,在 k-means 之前进行一些转换,结果是: 在此处输入图像描述

此处的输出对 y0 的原点设置非常敏感,我无法正确设置...

3个回答

我得到了一个部分解决方案,该解决方案可能适用于这种特殊情况,但它不容易概括:由于您的所有数据都收敛到同一点:(1400, 500),您可以在那里设置坐标中心,然后在角度空间中进行聚类。即使用转换

α=反正切(是的-是的0X-X0)
和集群α(小心!你可能会除以 0)

我已经在 R 中准备了这个合成示例并且它有效!但同样:这不容易概括

library(data.table)
library(ggplot2)

x <- c(1,2,3,4,5)
y1 <- x + 1
y2 <- -x + 11
y3 <- -3*x + 21

# creates a data.table with 3 lines converging at point (5,6)
dt <- data.table( x = rep(x, 3)
                , y = c(y1,y2,y3)
                )

data.table看起来像这样

在此处输入图像描述

现在是时候改造它并制作集群了

dt_transform <- dt[, .(x, y, a = atan((y - 6) / (x - 6)) )] # avoid x - 5 == 0

km <- kmeans(dt_transform$a, 3)

dt_cluster <- cbind(dt_transform, cluster = as.factor(km$cluster))

集群data.table看起来像这样:

在此处输入图像描述

如果你走这条路,请与我分享结果。我很想知道它是否适用于真实数据

您是否尝试过使用 K-means 算法?我认为它可以产生良好的效果!

这里还有其他选项:https ://towardsdatascience.com/unsupervised-learning-and-data-clustering-eeecb78b422a

编辑:我的第一个想法是使用 PCA,我只是注意到它可以用于未标记的数据

红线

在我看来,红线纯粹是主观的,这意味着它的缺失同样是合理的,因此,我们不应该期望它会普遍存在。例如,它正在通过靠近交点的密集聚集集(橙色圆圈),并且还在直线上分离一些等距的点(紫色圆圈)。

一个通用的解决方案

但是,可以使用以下步骤找到绿线(以及清楚区分两组的类似线):

  1. 应用非凸聚类算法,例如 DBSCAN(调整其参数至关重要),
  2. 将检测到的簇标记为类,
  3. 使用具有线性决策边界的多类分类器(例如多类逻辑回归或多类线性 SVM)来找到类之间的分隔线。

重新审视红线

正如OP 评论的那样,如果假设是“正好两行”,我同意红线是一个非常好的候选者。我们可以通过调整 DBSCAN 的参数来强加这个假设,即领域知识,直到我们得到 3 个填充良好的集群。