如何使用e1071计算数据点到SVM决策超平面的距离

我使用e1071包创建了一个预测两个类别的线性模型。现在我可以预测类别,但我也想知道每个预测到决策超平面的距离。

以下代码用于对iris数据进行子集划分,创建训练集和预测集:

# 数据应有2个因子,以便只有一个超平面
iris.subset <- subset(iris, iris$Species %in% c("versicolor", "virginica"))
iris.subset$Species <- as.factor(as.character(iris.subset$Species))
# 随机抽样用于训练数据
training.data <- iris.subset[sample(1:nrow(iris.subset), 50, replace=FALSE),]
# 剩余样本构成预测数据
prediction.data <- iris.subset[!(rownames(iris.subset) %in% rownames(training.data)),]

以下代码用于拟合模型:

require(e1071)
svmfit <- svm(Species~., data=training.data, kernel="linear")

从预测集中预测5个样本:

predict(svmfit, prediction.data[sample(1:nrow(prediction.data), 5, replace=FALSE),])

这让我得到了类别。现在,我想要计算这些点到超平面的距离。我该怎么做?

这里有一个类似但未回答的问题,不过是在Matlab中。这里是另一个可能有帮助的页面,但同样是在Matlab中。


回答:

你可以从预测中获取决策值,方法如下:

dd <- prediction.data[sample(1:nrow(prediction.data), 5, replace=FALSE),]
pred <- predict(svmfit, dd, decision.value=T)
pred #        112        139         87        108         70 
#  virginica  virginica versicolor  virginica versicolor 
# attr(,"decision.values")
#     virginica/versicolor
# 112            1.9830355
# 139            0.4160704
# 87            -1.2680673
# 108            2.7181950
# 70            -2.6954507

这些值以属性的形式返回。你可以更直接地访问数据,方法如下:

attr(pred, "decision.values")

这将返回一个值矩阵。

如需更多信息,你可以阅读?predict.svm的帮助页面

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注