Машина опорных векторов: сообщение об ошибке Python

1

Я относительно новичок в Machine Learning, и я решил углубиться в некоторую теорию, а затем практиковать с помощью некоторого кода. В процессе я получил много сообщений об ошибках, которые мне удалось исправить, но я потерялся с этим. Я также относительно новичок в Python, поэтому я уверен, что это проблема, связанная с синтаксисом, но на этот раз я не смог ее закрепить (Python 2.7.15). Здесь полный код:

import numpy as np
from matplotlib import pyplot as plt

# Next we input our data of the for [X, Y, Bias] in a matrix using the Numpy array method:

X = np.array([ 
    [-2, 4,-1], 
    [2, -2, -1],
    [2, 4, -1],
    [8,-4, -1],
    [9, 4, -1],
])

# Let make another variable Y that contains the output labels for each element in the matrix:

Y = np.array([-1,-1,1,1,1])

#Now let plot our data. We're going to use a For Loop for this:

for index,element in enumerate(X):
    if index<2:
        plt.scatter(element[0],element[1], marker="_", s=120, color="r")
    else:
        plt.scatter(element[0],element[1], marker="+", s=120, color="b")

plt.plot([-2,8], [8,0.5])
plt.show()


def svm_sgd_plot(X, Y):
    #Initialize our SVMs weight vector with zeros (3 values)
    w = np.zeros(len(X[0]))
    #The learning rate
    eta = 1
    #how many iterations to train for
    epochs = 100000
    #store misclassifications so we can plot how they change over time
    errors = []

    #training part & gradient descent part
    for epoch in range(1,epochs):
        error = 0
        for i, x in enumerate(X):
            #misclassification
            if (Y[i]*np.dot(X[i], w)) < 1:
                #misclassified update for ours weights
                w = w + eta * ( (X[i] * Y[i]) + (-2  * (1/epoch) * w) )
                error = 1
            else:
                #correct classification, update our weights
                w = w + eta * (-2  * (1/epoch) * w)
    errors.append(error)

    # lets plot the rate of classification errors during training for our SVM

    plt.plot(errors, '|')
    plt.ylim(0.5,1.5)
    plt.axes().set_yticklabels([])
    plt.xlabel('Epoch')
    plt.ylabel('Misclassified')
    plt.show()

    return w

for d, sample in enumerate(X):
        # Plot the negative samples
    if d < 2:
        plt.scatter(sample[0], sample[1], s=120, marker='_', linewidths=2)
        # Plot the positive samples
    else:
        plt.scatter(sample[0], sample[1], s=120, marker='+', linewidths=2)

# Add our test samples
plt.scatter(2,2, s=120, marker='_', linewidths=2, color='yellow')
plt.scatter(4,3, s=120, marker='+', linewidths=2, color='blue')
plt.show()

# Print the hyperplane calculated by svm_sgd()
x2=[ w[0],w[1],-w[1],w[0] ]
x3=[ w[0],w[1],w[1],-w[0] ]

x2x3 = np.array([x2,x3])
X,Y,U,V = zip(*x2x3)
ax = plt.gca()
ax.quiver(X,Y,U,V,scale=1, color='blue')

w = svm_sgd_plot(X,Y)

Но я продолжаю получать следующую ошибку:

Traceback (последний последний вызов): Файл "C:\Users...\Support Vector Machine (с нуля).py", строка 134, в x2 = [w [0], w [1], -w [ 1], w [0]] NameError: имя 'w' не определено

Надеюсь, кто-то более осведомленный поможет. Благодарю.

  • 1
    Я копаю твой аватар. Также NameError происходит, когда вы не определили переменную. Просмотрите свой код, чтобы найти, где вы определяете w .
  • 0
    @ Скотт Хаха, спасибо. Ну, я думал, что определил это при определении функции svm_sgd_plot (): as "w = np.zeros (len (X [0]))", но, видимо, это не сработало, и это меня озадачило, потому что раньше всегда работало в других программах.
Показать ещё 2 комментария
Теги:
machine-learning
python-2.7
svm

1 ответ

2
Лучший ответ

Сначала вы определили w внутри метода svm_sgd_plot, но этот метод ничего не делает, пока вы явно не назовете его сделать что-то.

Вы можете вызвать его, добавив строку w = svm_sgd_plot(X,Y), например, после построения ваших тестовых данных, поэтому ваш код будет

#PLOT TRAINING DATA

for d, sample in enumerate(X):
    # Plot the negative samples
if d < 2:
    plt.scatter(sample[0], sample[1], s=120, marker='_', linewidths=2)
    # Plot the positive samples
else:
    plt.scatter(sample[0], sample[1], s=120, marker='+', linewidths=2)

#PLOT TESTING DATA

# Add our test samples
plt.scatter(2,2, s=120, marker='_', linewidths=2, color='yellow')
plt.scatter(4,3, s=120, marker='+', linewidths=2, color='blue')
plt.show()

#CALL YOUR METHOD
w = svm_sgd_plot(X,Y)

Затем вам просто нужно визуализировать классификацию, предоставленную вашим методом. Я добавил два наблюдения данных тестирования, чтобы вы могли увидеть, как ваш метод SVM правильно их классифицирует. Обратите внимание, что желтая точка и синяя точка разделены линией, сгенерированной вашим методом SVM.

# Print the hyperplane calculated by svm_sgd()
x2=[ w[0],w[1],-w[1],w[0] ]
x3=[ w[0],w[1],w[1],-w[0] ]

x2x3 = np.array([x2,x3])
X,Y,U,V = zip(*x2x3)
ax = plt.gca()
ax.quiver(X,Y,U,V,scale=1, color='blue')
#I ADDED THE FOLLOWING THREE LINES SO THAT YOU CAN SEE HOW YOU TESTING DATA IS BEING CLASSIFIED BY YOUR SVM METHOD
plt.scatter(2,2, s=120, marker='_', linewidths=2, color='yellow')
plt.scatter(4,3, s=120, marker='+', linewidths=2, color='blue')
plt.show()

Изображение 174551

  • 0
    Ох, теперь я вижу. Спасибо !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню