如何在 R 的 3D 图中从分类算法中绘制分区平面
Posted
技术标签:
【中文标题】如何在 R 的 3D 图中从分类算法中绘制分区平面【英文标题】:How do you draw a partition plane from a classification algorithm in a 3D plot in R 【发布时间】:2021-12-11 03:28:53 【问题描述】:我正在尝试从 R 中的 3D 图中的分类算法绘制分区边界(使用 plot3D
)。如果我们只有两个预测变量,这将是一项相对简单的任务,只需要绘制两个轴(例如,使用 partimat
函数)。我还没有找到令人满意的方法来在 3D 空间中绘制基于三个预测器的分类分区。
为了可视化问题,让我们首先使用 iris 数据集上的线性判别分析 (LDA) 分类算法为两个轴构建一个分区:
# Load packages and subset the iris dataset:
library(klaR)
data = droplevels(iris[iris$Species != 'virginica', ])
partimat(Species ~ Sepal.Length + Sepal.Width, data,
method = 'lda')
我们得到一个 2D 图,在两个物种之间有明确的划分:
但是,partimat
一次只能处理两个预测变量(请参阅?partimat
)。现在让我们看看 3D 问题:
library(plot3D)
# Plot the raw data:
points3D(data$Sepal.Length, data$Sepal.Width, data$Petal.Length,
colkey = F,
pch = 16, cex = 2,
theta = 30, phi = 30,
ticktype = 'detailed',
col = data$Species)
我想根据 LDA 之类的分类算法绘制一个将两个数据类分开的平面。从Roman Luštrik's example 中汲取灵感,这是我在定义三个预测变量之间的划分方面的糟糕尝试。本质上,我建立了一个包含三个预测变量的 LDA 模型,然后将物种(setosa 或 versicolor)预测到最大值之间的多个点上。和分钟。所有三个预测变量的值。当绘制在 3D 图上时,这会生成一个点云,以不同的颜色表示 3D 空间,根据三个预测变量,其中一种虹膜物种应该出现:
# Build a classification model with three predictors:
m = lda(Species ~ Sepal.Length + Sepal.Width + Petal.Length, data)
# Predict 'Species' for the full range of each plant metric:
np = 50
nx = seq(from = min(data[, 1]), to = max(data[, 1]), length.out = np)
ny = seq(from = min(data[, 2]), to = max(data[, 2]), length.out = np)
nz = seq(from = min(data[, 3]), to = max(data[, 3]), length.out = np)
nd = expand.grid(Sepal.Length = nx, Sepal.Width = ny, Petal.Length = nz)
p = as.numeric(predict(m, newdata = nd)$class)
part = cbind(nd, Partition = p)
# Plot the partition and add the data points:
scatter3D(part$Sepal.Length, part$Sepal.Width, part$Petal.Length,
colvar = part$Partition,
colkey = F,
alpha = 0.5,
pch = 16, cex = 0.3,
theta = 30, phi = 30,
ticktype = 'detailed',
plot = F)
points3D(data$Sepal.Length, data$Sepal.Width, data$Petal.Length,
colkey = F,
pch = 16, cex = 2,
theta = 30, phi = 30,
ticktype = 'detailed',
col = data$Species,
add = T)
我还添加了数据点。您可以将分区视为点云中蓝色和红色之间的模糊交集:
这不是一个理想的解决方案,因为很难看到隐藏在点云中的数据点。点云也有点分散注意力。也许一些巧妙的透明点的绘图会改善事情,但我怀疑一个更好的解决方案是在物种类别之间的相交处(即蓝色和红色点相遇的地方)绘制一个平面(类似于regression plane) .请注意,我最终希望使用不同的分类器(例如随机森林),以防万一存在仅限于 LDA 或类似的解决方案。
非常感谢您提供任何解决方案或建议。
【问题讨论】:
【参考方案1】:您可以使用来自 lda 模型的系数来生成分离判别体积的平面。实际上,平面是 3D 空间中的一组点,其中 (x, y, z) 坐标的总和乘以它们各自的模型系数等于模型的阈值(即模型可以'不要区分一组)。
我们可以通过沿 x 和 y 轴创建一个 10 x 10 的等距值网格并计算 z 值,从而根据模型为我们提供阈值:
threshold <- sum(coef(m) * data[1, 1:3]) - predict(m)$x[1]
Sepal_Lengths <- seq(min(data$Sepal.Length), max(data$Sepal.Length), length.out = 10)
Sepal_Widths <- seq(min(data$Sepal.Width), max(data$Sepal.Width), length.out = 10)
Petal_Lengths <- outer(Sepal_Lengths, Sepal_Widths, function(x, y)
(threshold - x * coef(m)[1] - y * coef(m)[2]) / coef(m)[3])
所以现在当我们得出我们的观点时:
points3D(data$Sepal.Length, data$Sepal.Width, data$Petal.Length,
colkey = F,
pch = 16, cex = 2,
theta = 30, phi = 30,
ticktype = 'detailed',
col = data$Species)
添加飞机很简单:
persp3D(x = Sepal_Lengths,
y = Sepal_Widths,
z = Petal_Lengths,
col = "gold", add = TRUE, alpha = 0.5)
【讨论】:
太棒了,感谢您的解决方案。我也非常感谢您对如何根据模型系数计算飞机的解释。我期待与其他分类器一起尝试!以上是关于如何在 R 的 3D 图中从分类算法中绘制分区平面的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用scatterplot3d包的scatterplot3d函数可视化3D散点图(3D scatter plots)在3D散点图中添加垂直线和数据点描影3D图中添加回归平面