首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加权k-近邻与R~k~n包

加权k-近邻与R~k~n包
EN

Stack Overflow用户
提问于 2021-01-10 14:43:26
回答 1查看 693关注 0票数 0

我想了解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软件包是如何用“三角形”、“高斯”和“逆”权重(以及更一般的)进行同样的计算的。

代码语言:javascript
复制
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"]]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-13 15:14:03

调用kknn::kknn会在控制台中打印kknn函数的源代码。有了它,我们就可以逐行遍历函数来查看它所做的事情。

距离

kknn调用编译后的C代码dmEuclid。为了获得它的源代码,我们遵循本指南,在R中编写了以下代码:

代码语言:javascript
复制
untar(download.packages(pkgs = "kknn", destdir = ".", type = "source")[,2])

然后在工作目录(getwd())中打开kknn_1.3.1.tar的src目录,使用任何文本编辑器查找和打开dm.C。滚动大约一半找到dmEuclid。要测试dmEuclid的确切输出,您可以安装构建工具,并在Rstudio中通过在下拉菜单中选择它打开一个C++文件,并以不同的输入运行代码。

在函数输出之后,在您的示例中,dmtmp$dm将导致

代码语言:javascript
复制
3.779645e-01  1.133893e+00 1.000000e+150 3.685210e-156

根据您的规范k,前3个值被选择为距离D。这是由包创建者手动转换为maxdist = 1e-06的,因为最大距离比您的情况要小。

权重

kknn函数使用下面的部分为您定义的内核分配权重方案。

代码语言:javascript
复制
 W <- D/maxdist
 W <- pmin(W, 1 - (1e-06))
 W <- pmax(W, 1e-06)

此时你的W值大于1,所以W被强迫到大约1。

代码语言:javascript
复制
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=3cl = c(1,0,1)

代码语言:javascript
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65654487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档