2016-03-26 12 views
2

sklearn.svm.svc() öğesini kullanarak 3 özellikli veri kümesine uyduğum. Matplotlib ve Axes3D kullanarak her bir gözlem için noktayı çizebilirim. Uygunluğu görmek için karar sınırını çizmek istiyorum. Karar sınırını boşuna çizmek için 2D örneklerini uyarlamayı denedim. Clf.coef_'ın karar sınırına normal bir vektör olduğunu anlıyorum. Puanları nereye böldüğünü görmek için bunu nasıl çizebilirim?3D Karar Sınırını Çizmek Doğrusal SVM'den

cevap

5

İşte bir oyuncak veri kümesi üzerinde bir örnektir. 3B'de çizimin matplotlib ile eğlenceli olduğunu unutmayın. Bazen, düzlemin arkasında bulunan noktalar önündeymiş gibi görünebilir, bu yüzden neler olup bittiğini anlamak için arsa döndürmekle uğraşmak zorunda kalabilirsiniz.

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
from sklearn.svm import SVC 

rs = np.random.RandomState(1234) 

# Generate some fake data. 
n_samples = 200 
# X is the input features by row. 
X = np.zeros((200,3)) 
X[:n_samples/2] = rs.multivariate_normal(np.ones(3), np.eye(3), size=n_samples/2) 
X[n_samples/2:] = rs.multivariate_normal(-np.ones(3), np.eye(3), size=n_samples/2) 
# Y is the class labels for each row of X. 
Y = np.zeros(n_samples); Y[n_samples/2:] = 1 

# Fit the data with an svm 
svc = SVC(kernel='linear') 
svc.fit(X,Y) 

# The equation of the separating plane is given by all x in R^3 such that: 
# np.dot(svc.coef_[0], x) + b = 0. We should for the last coordinate to plot 
# the plane in terms of x and y. 

z = lambda x,y: (-svc.intercept_[0]-svc.coef_[0][0]*x-svc.coef_[0][1])/svc.coef_[0][2] 

tmp = np.linspace(-2,2,51) 
x,y = np.meshgrid(tmp,tmp) 

# Plot stuff. 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(x, y, z(x,y)) 
ax.plot3D(X[Y==0,0], X[Y==0,1], X[Y==0,2],'ob') 
ax.plot3D(X[Y==1,0], X[Y==1,1], X[Y==1,2],'sr') 
plt.show() 

Çıktı:

+0

iyi cevap için teşekkürler ve çok net bir açıklama! Kesişmenin anlamını yanlış anladım! – pioneer903

+1

Çok teşekkür ederim Chester. Sadece bir küçük hata ya da yazım hatası var: '(-svc.intercept_ [0] -svc.coef_ [0] [0] * x-svc.coef_ [0] [1]' __ * y__ ')/svc.coef_ [0] [2] ' – mescarra