2013-08-14 4 views
0

내 svm 분류 자 ​​결과를 플롯하려고합니다. "미니 프로그램"은 here으로 표시됩니다. 음모를 꾸미기 위해 나는 scikit-learn의 this 예제를 계속 사용합니다. 아래에서 볼 수 있듯이 코드를 수정했습니다. 클러스터 센터 (100 ~ 300 개의 원본 데이터)가 줄어들거나 발생하는 경우 2-D로 내 데이터를 줄이는 시점을 이해하지 못하기 때문에 올바른 방법인지 잘 모릅니다. 큰 "차원"을 가지고 2 차원으로 짜낼 때. 어쩌면 누군가가SVM 분류 자의 결과를 sklearn 플로팅

#!/usr/bin/env python 

import numpy as np 
import pylab as pl 
from matplotlib.colors import ListedColormap 
from sklearn.decomposition import PCA 
from sklearn.cluster import KMeans 

def reduce_dim(datas): 
    pca = PCA(n_components=2) 
    pca.fit(datas) 
    data_pca = pca.transform(datas) 
    return data_pca 

def plotter_plot(kmeans, clf, X, X_train, X_test, y_train, y_test): 
    names = ["RBF SVM"] 
    classifiers = [] 
    classifiers.append(clf) 

    h = .01 # step size in the mesh 
    X_r = reduce_dim(X) 
    X_train_r = reduce_dim(X_train) 
    X_test_r = reduce_dim(X_test) 

    figure = pl.figure(figsize=(15, 5)) 

    x_min, x_max = X_r[:, 0].min() - .5, X_r[:, 0].max() + .5 
    y_min, y_max = X_r[:, 1].min() - .5, X_r[:, 1].max() + .5 
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h)) 

    # just plot the dataset first 
    cm = pl.cm.RdBu 
    cm_bright = ListedColormap(['#FF0000', '#0000FF']) 
    ax = pl.subplot(1, 2, 1) 
    # Plot the training points 
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) 
    # and testing points 
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6) 
    ax.set_xlim(xx.min(), xx.max()) 
    ax.set_ylim(yy.min(), yy.max()) 
    ax.set_xticks(()) 
    ax.set_yticks(()) 
    i = 2 
    for name, clf in zip(names, classifiers): 
     ax = pl.subplot(1, 2, i) 
     clf.fit(X_train_r, y_train) 
     score = clf.score(X_test_r, y_test) 

     # Plot the decision boundary. For that, we will assign a color to each 
     # point in the mesh [x_min, m_max]x[y_min, y_max]. 
     if hasattr(clf, "decision_function"): 
      Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) 
     else: 
      Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1] 

     # Put the result into a color plot 
     Z = Z.reshape(xx.shape) 
     ax.contourf(xx, yy, Z, cmap=cm, alpha=.8) 

     # Plot also the training points 
     ax.scatter(X_train_r[:, 0], X_train_r[:, 1], c=y_train, cmap=cm_bright) 
     # and testing points 
     ax.scatter(X_test_r[:, 0], X_test_r[:, 1], c=y_test, cmap=cm_bright, 
       alpha=0.6) 

     ax.set_xlim(xx.min(), xx.max()) 
     ax.set_ylim(yy.min(), yy.max()) 
     ax.set_xticks(()) 
     ax.set_yticks(()) 
     ax.set_title(name) 
     ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'), 
      size=15, horizontalalignment='right') 
     i += 1 

    figure.subplots_adjust(left=.02, right=.98) 
    pl.show() 

이는이 CLF 다시 "데이터를 줄일 수"에 맞게 올바른 방법입니다 ^^ 나를 위해 그것을 설명 할 수 있을까? 그들은 이미 훈련과 분류로 적합했습니다! 그래서 실수가 있습니까? 아니면 다시 2 차원 데이터에 적합해야합니까?

고맙습니다 ...

+0

오, 안녕하세요 당신은 저입니다. ^^ 제가 대답을 게시 한 후에 그것을 보았습니다. * g * –

답변

2

짧은 대답 : 당신이하려는 것은 불가능합니다. 이전에 몇 번 정도 물었습니다.

2 차원에서 n 차원 결정 표면을 플로팅 할 수 없습니다. 당신이 할 수있는 것은 단지 2d에있는 데이터의 투영을 계획하고 예측에 따라 라벨을 붙이는 것입니다.

당신이 원하는 것과 비슷한 것을하는 플롯이 in this example입니다. 예제의 작성자이지만 줄거리가 실제 의미를 가지고 있는지 확신하지 못합니다. 분류자를 검사 할 때 이와 같은 플롯을 사용하지 않습니다.

+0

안녕하세요, Andreas도 참조한 코드를 따라 가고 있었는데 ... 그럼 코드의 핵심은 무엇입니까? 그리고 분류 표면을 그래픽으로 (또는 근사치로 - 어떻게 든 표시) 표시하는 좋은 방법으로 무엇을 권하고 싶습니까? 감사! – mfcabrera

+0

코드는 시각화를 시도합니다. 차라리 공간이 아니라 점의 레이블을 시각화하려고합니다. 매니 폴드 러닝/pca를 할 수 있으며 분류에 따라 포인트에 레이블을 붙일 수 있습니다. 그것은 내가 원래의 게시물에서 말한 것처럼 도움이 될 것입니다. –

+0

감사합니다. Andreas !. PCA는 또한 클래스를 기반으로 플롯을 분산시키는 코드에서 수행되고 있습니다. 나는 t-SNE가 좋은 후보라고 생각합니다. 건배. – mfcabrera

관련 문제