R ggplot stat_contour 返回一个我无法解决的错误

R ggplot stat_contour returning an error I can't solve

我正在 EdEx 上学习哈佛 R 课程;我正在学习机器学习模块,涵盖 knn。我使用 mnist_27 训练数据创建了一个 knn 拟合,然后使用预测函数来确定结果是数字 2 还是 7。使用 ggplot,我根据上的像素绘制了预测点 (y)网格(x_1 和 x_2);然后我用 y 给它们上色。我现在要做的是在 p=0.5 边界处使用 stat_contour 放置一个轮廓。但是,我收到此错误:

Computation failed in stat_contour(): Contour requires single z at each combination of x and y.

library(tidyverse)
library(caret)
library(dslabs)

data("mnist_27")

knn_fit <- knn3(y ~ ., data = mnist_27$train, k = 5)

x_1 <- mnist_27$train$x_1
x_2 <- mnist_27$train$x_2
y_x <- predict(knn_fit, mnist_27$train, type = "class")
p_hat_knn <- predict(knn_fit, mnist_27$train, type = "prob")
p_x <- p_hat_knn[,2]

knn_df <- data.frame(x_1, x_2, p_x, y_x)

plot_val <- knn_df %>%
  ggplot() +
    geom_point(aes(x = x_1, y = x_2, colour = factor(y_x)), shape=21, size=2, stroke=1) +
    stat_contour(aes(x = x_1, y = x_2, z=p_x), breaks=c(0.5), color="black")

plot(plot_val)

错误告诉我我没有每个 (x_1, x_2) 对的轮廓概率,但我的数据框有一个 p_x每一行,所以我不确定出了什么问题。如果有人能提供帮助,将不胜感激。

我不太明白为什么,但我认为stat_contour失败的原因是由于对(x_1,x_2)的观察不足,因此p。

我没有使用训练数据集(800 个观测值)中的 (x_1,x_2),而是使用了完整的数据集 (mnist$true_p),它有 22500 个观测值.我重新编码以使用 (mnist$true_p$x_1, mnist$true_p$x_2) 从拟合中得到 p_x。使用相同的代码,stat_contour 然后工作。

k_val <- 1

knn_fit <- knn3(y ~ ., data = mnist_27$train, k = k_val)
x_1 <- mnist_27$true_p$x_1
x_2 <- mnist_27$true_p$x_2
knn_df <- data.frame(x_1, x_2)
y_x <- predict(knn_fit, knn_df, type = "class")
p_hat_knn <- predict(knn_fit, knn_df, type = "prob")
p_x <- p_hat_knn[,2]
knn_df <- data.frame(x_1, x_2, p_x)
p1 <- ggplot() +
    geom_point(data=mnist_27$train, aes(x = x_1, y = x_2, colour = factor(y)), shape=21, size=2, stroke=1) +
    stat_contour(data=knn_df, aes(x=x_1, y=x_2, z=p_x), breaks=c(0.5), color="black")
plot(p1)

knn_fit <- knn3(y ~ ., data = mnist_27$test, k = k_val)
x_1 <- mnist_27$true_p$x_1
x_2 <- mnist_27$true_p$x_2
knn_df <- data.frame(x_1, x_2)
y_x <- predict(knn_fit, knn_df, type = "class")
p_hat_knn <- predict(knn_fit, knn_df, type = "prob")
p_x <- p_hat_knn[,2]
knn_df <- data.frame(x_1, x_2, p_x)
p2 <- ggplot() +
    geom_point(data=mnist_27$test, aes(x = x_1, y = x_2, colour = factor(y)), shape=21, size=2, stroke=1) +
    stat_contour(data=knn_df, aes(x=x_1, y=x_2, z=p_x), breaks=c(0.5), color="black")
plot(p2)

grid.arrange(p1, p2, nrow=1)

代码现在生成了我需要的东西。

如果有人有任何进一步的建议,请告诉我。谢谢