2012-04-22 45 views
3

如何繪製一個三維數據集的SVM(帶有x,y,z座標)?繪製三維空間支持向量機

我可以通過使用scatterplot3d(data)來繪製3D數據,但在使用svm結果時它如何工作?

編輯:從評論複製到答覆。這應該是由OP編輯:

3組數據

data[1:10,1], data[1:10,2] and data[1:10,3] represent genuine data. 
data[11:15,1], data[11:15,2] and data[11:15,3] represent userA data. 
data[16:20,1], data[16:20,2] and data[16:20,3] represent userB data. 

然後我做的SVM有:

labels <- matrix(c(rep(1,10), rep(-1, 10))) 
svp <- ksvm(data,labels, type="C-svc" , kernel='rbfdot', C=0.4, 
       kpar=list(sigma=0.2)) 

然後我有一個數據測試:

dataTest[1,1], dataTest[1,2], dataTest[1,3] 
predLabels = predict(svp,dataTest) 

編者按:最後一點看起來有點奇怪,只有3個數據點。

+0

我不太清楚你想要什麼,我不是很熟悉SVM。我懷疑你可以使用'rgl'包中的'points3d'(這是'scatterplot3d'構建的內容),使用不同的顏色來分類爲0和1的點?要繪製的輸出結果的一個小重現示例(http://tinyurl.com/reproducible-000)會很有幫助。 – 2012-04-22 15:00:56

+1

不完全是3D,但本文討論了一些分類圖。 http://www.jstatsoft.org/v15/i09/paper – 2012-04-23 06:08:18

回答

12

爲了獲得核變換SVM的決策邊界,我通常只是預測一個新數據的網格,然後在decision value = 0級別上擬合一個輪廓(或3D等值面)。在3D中,您可以使用出色的rgl包進行繪圖(如Ben建議),並使用misc3d包中的contour3d()功能。這裏有一個例子:

library(e1071) 
library(rgl) 
library(misc3d) 

n = 100 
nnew = 50 

# Simulate some data 
set.seed(12345) 
group = sample(2, n, replace=T) 
dat = data.frame(group=factor(group), matrix(rnorm(n*3, rep(group, each=3)), ncol=3, byrow=T)) 

# Fit SVM 
fit = svm(group ~ ., data=dat) 

# Plot original data 
plot3d(dat[,-1], col=dat$group) 

# Get decision values for a new data grid 
newdat.list = lapply(dat[,-1], function(x) seq(min(x), max(x), len=nnew)) 
newdat  = expand.grid(newdat.list) 
newdat.pred = predict(fit, newdata=newdat, decision.values=T) 
newdat.dv = attr(newdat.pred, 'decision.values') 
newdat.dv = array(newdat.dv, dim=rep(nnew, 3)) 

# Fit/plot an isosurface to the decision boundary 
contour3d(newdat.dv, level=0, x=newdat.list$X1, y=newdat.list$X2, z=newdat.list$X3, add=T) 

enter image description here enter image description here

+0

我是R的初學者,這就是我想要做的事情....例子我高三組數據,數據[1:10,1],數據[1:10,2]和數據[1:10,3]代表真正的數據。數據[11:15,1],數據[11:15,2]和數據[11:15,3]代表用戶A的數據。數據[16:20,1],數據[16:20,2]和數據[16:20,3]代表用戶B數據。然後我用標籤< - 矩陣(c(rep(1,10),rep(-1,10))),svp < - ksvm(data,labels,type =「C-svc」,kernel =' rbfdot',C = 0.4,kpar = list(sigma = 0.2)) 然後我用dataTest [1,1],dataTest [1,2],dataTest [1,3] predLabels = predict(svp, dataTest)。如何在數據和dataTest之間繪製等值面? – jesslim 2012-04-23 14:37:25

+1

@jesslim只要按照上面的總體示意圖閱讀這些功能的幫助文件,當你不理解某些東西時。上面我的例子的一個小差異是'kernlab'包中的'ksvm()'使用'type ='decision''來指定你想要的決策值,並且直接作爲一個向量返回它們,而不是一個屬性,所以你可以跳過下一個'attr(...)'行。等值面僅來自訓練數據,但當然你可以自由地將你的測試數據添加到同一個圖中。祝你好運! – 2012-04-23 16:41:50

+0

通過調整'contour3d()'的'level'參數,可以創建頁邊距。我添加了兩個輪廓,alpha設置爲0.1,每邊都有一個很好的透明邊距。 – naco 2017-05-26 22:29:56