我想了解R包是如何计算二进制分类问题的权重、距离和类概率的。在下面的R代码中,在训练样本中有三个观察,在保留样本中有一个观察。两个预测变量是身高和体重。根据欧几里德距离,训练样本中每一次观测的距离为:
(6-8)^2+ (4-5)^2) = 2.24
(6-3)^2+ (4-7)^2) = 4.24
sqrt(6-7)^2+ (4-3)^2) = 1.41。
在k=3和相同权重的情况下,我得到了抵抗的概率如下:
(1/3 * 1) + (1/3 * 0) + (1/3 * 1) = 0.67。
在k=2和相同权重的情况下,我得到了抵抗的概率如下:
(1/2 * 1) + (1/2 * 1) = 1.00。
我想了解makes软件包是如何用“三角形”、“高斯”和“逆”权重(以及更一般的)进行同样的计算的。
library(kknn)
training <- data.frame(class = c(1, 0, 1), height = c(8, 3, 7), weight = c(5, 7, 3))
holdouts <- data.frame(class = 1, height = 6, weight = 4)
triangular_kernel <- kknn(class ~., training, holdouts, distance = 2, kernel = "triangular", k = 3)
triangular_kernel[["fitted.values"]]
triangular_kernel[["W"]]
triangular_kernel[["D"]]
gaussian_kernel <- kknn(class ~., training, holdouts, distance = 2, kernel = "gaussian", k = 3)
gaussian_kernel[["fitted.values"]]
gaussian_kernel[["W"]]
gaussian_kernel[["D"]]
inverse_kernel <- kknn(class ~., training, holdouts, distance = 2, kernel = "inv", k = 3)
inverse_kernel[["fitted.values"]]
inverse_kernel[["W"]]
inverse_kernel[["D"]]发布于 2021-01-13 15:14:03
调用kknn::kknn会在控制台中打印kknn函数的源代码。有了它,我们就可以逐行遍历函数来查看它所做的事情。
距离
kknn调用编译后的C代码dmEuclid。为了获得它的源代码,我们遵循本指南,在R中编写了以下代码:
untar(download.packages(pkgs = "kknn", destdir = ".", type = "source")[,2])然后在工作目录(getwd())中打开kknn_1.3.1.tar的src目录,使用任何文本编辑器查找和打开dm.C。滚动大约一半找到dmEuclid。要测试dmEuclid的确切输出,您可以安装构建工具,并在Rstudio中通过在下拉菜单中选择它打开一个C++文件,并以不同的输入运行代码。

在函数输出之后,在您的示例中,dmtmp$dm将导致
3.779645e-01 1.133893e+00 1.000000e+150 3.685210e-156根据您的规范k,前3个值被选择为距离D。这是由包创建者手动转换为maxdist = 1e-06的,因为最大距离比您的情况要小。
权重
kknn函数使用下面的部分为您定义的内核分配权重方案。
W <- D/maxdist
W <- pmin(W, 1 - (1e-06))
W <- pmax(W, 1e-06)此时你的W值大于1,所以W被强迫到大约1。
if (kernel == "inv"
W <- 1/W
if (kernel == "triangular")
W <- 1 - W
if (kernel == "gaussian") {
alpha = 1/(2 * (k + 1))
qua = abs(qnorm(alpha))
W = W * qua
W = dnorm(W, sd = 1)
}对此的解释可以在gowerc的文章中找到。然后将W转换为矩阵W <- matrix(W, p, k) (1行(p=1),3列(k=3) )。
拟合值
在您的例子中,p = 1是1,k=3,cl = c(1,0,1)。
C <- matrix(dmtmp$cl, nrow = p, ncol = k + 1)
C <- C[, 1:k] + 1
CL <- matrix(cl[C], nrow = p, ncol = k)
W <- matrix(W, p, k)
fit <- rowSums(W * CL)/pmax(rowSums(W), 1e-06)https://stackoverflow.com/questions/65654487
复制相似问题