25

Python で LibSVM を使用した分類タスクの例が急務です。入力がどのように見えるべきか、どの関数がトレーニングを担当し、どの関数がテストを担当するのかわかりません ありがとう

4

8 に答える 8

24

ここにリストされているコード例は LibSVM 3.1 では機能しないため、mossplixによって多かれ少なかれサンプルを移植しました

from svmutil import *
svm_model.predict = lambda self, x: svm_predict([0], [x], self)[0][0]

prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]])

param = svm_parameter()
param.kernel_type = LINEAR
param.C = 10

m=svm_train(prob, param)

m.predict([1,1,1])
于 2011-07-18T12:23:19.140 に答える
20

この例は、1 クラスのSVM 分類器を示しています。完全な LIBSVM ワークフローを示しながら、可能な限りシンプルにしています。

ステップ 1 : NumPy と LIBSVM をインポートする

  import numpy as NP
    from svm import *

ステップ 2:合成データの生成: この例では、特定の境界内に 500 ポイント (注: かなりの数の実際のデータ セットが LIBSVM Web サイトで提供されています)

Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)

ステップ 3:ここで、 1 クラス分類器の非線形決定境界を選択します

rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ]

ステップ 4:次に、この決定境界でデータを任意に分割します。

  • クラス I :任意の円上または円内にあるもの

  • クラス II : 決定境界外のすべての点(円)


SVM モデルの構築はここから始まります。これより前のすべてのステップは、合成データを準備するためのものでした。

ステップ 5 : svm_problemを呼び出し、決定境界関数dataを渡して問題の説明を作成し、この結果を変数にバインドします。

px = svm_problem(rx, Data)

ステップ 6:非線形マッピングのカーネル関数を選択する

この例では、カーネル関数としてRBF (動径基底関数) を選択しました。

pm = svm_parameter(kernel_type=RBF)

ステップ 7: svm_modelを呼び出して分類し、問題の説明(px) とカーネル(pm)

v = svm_model(px, pm)

ステップ 8:最後に、トレーニング済みのモデル オブジェクト ('v') でpredictを呼び出して、トレーニング済みの分類器をテストします。

v.predict([3, 1])
# returns the class label (either '1' or '0')

上記の例では、 LIBSVMのバージョン3.0を使用しました (この回答が投稿された時点での最新の安定版リリース)。

最後に、カーネル関数の選択に関する質問の一部について説明します。サポート ベクター マシンは、特定のカーネル関数に固有のものではありません。たとえば、別のカーネル (ガウス、多項式など) を選択した可能性があります

LIBSVM には、最も一般的に使用されるすべてのカーネル関数が含まれています。これは、もっともらしい代替案をすべて確認し、モデルで使用するものを選択できるため、大きな助けになります。svm_parameterを呼び出して、kernel_type (a選択したカーネルの 3 文字の略語)。

最後に、トレーニング用に選択するカーネル関数は、テスト データに対して使用されるカーネル関数と一致する必要があります。

于 2010-11-18T13:20:32.093 に答える
13

LIBSVM は、2 つのリストを含むタプルからデータを読み取ります。最初のリストにはクラスが含まれ、2 番目のリストには入力データが含まれます。svm_parameter を作成して、使用するカーネルを指定する必要がある 2 つの可能なクラスを含む単純なデータセットを作成します。


>> from libsvm import *
>> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]])
>> param = svm_parameter(kernel_type = LINEAR, C = 10)
  ## training  the model
>> m = svm_model(prob, param)
#testing the model
>> m.predict([1, 1, 1])


于 2010-11-18T13:07:26.837 に答える
5

あなたは使用を検討するかもしれません

http://scikit-learn.sourceforge.net/

これには、libsvm の優れた python バインディングがあり、簡単にインストールできるはずです。

于 2010-12-28T03:03:13.383 に答える
3

@shinNoNoir への追加:

param.kernel_type は、使用するカーネル関数のタイプを表します。0: 線形 1: 多項式 2: RBF 3: シグモイド

また、 svm_problem(y,x) : ここで y はクラス ラベル、x はクラス インスタンス、x と y はリスト、タプル、辞書のみであることに注意してください (numpy 配列ではありません)。

于 2011-11-28T21:32:24.167 に答える
2

これは私がマッシュアップしたダミーの例です:

import numpy
import matplotlib.pyplot as plt
from random import seed
from random import randrange

import svmutil as svm

seed(1)

# Creating Data (Dense)
train = list([randrange(-10, 11), randrange(-10, 11)] for i in range(10))
labels = [-1, -1, -1, 1, 1, -1, 1, 1, 1, 1]
options = '-t 0'  # linear model
# Training Model
model = svm.svm_train(labels, train, options)


# Line Parameters
w = numpy.matmul(numpy.array(train)[numpy.array(model.get_sv_indices()) - 1].T, model.get_sv_coef())
b = -model.rho.contents.value
if model.get_labels()[1] == -1:  # No idea here but it should be done :|
    w = -w
    b = -b

print(w)
print(b)

# Plotting
plt.figure(figsize=(6, 6))
for i in model.get_sv_indices():
    plt.scatter(train[i - 1][0], train[i - 1][1], color='red', s=80)
train = numpy.array(train).T
plt.scatter(train[0], train[1], c=labels)
plt.plot([-5, 5], [-(-5 * w[0] + b) / w[1], -(5 * w[0] + b) / w[1]])
plt.xlim([-13, 13])
plt.ylim([-13, 13])
plt.show()

ここに画像の説明を入力

于 2017-12-25T00:13:16.903 に答える