2016-10-25 4 views
2
import matplotlib.pyplot as plt 

from sklearn import datasets 
from sklearn import svm 

digits = datasets.load_digits() 

print(digits.data) 

classifier = svm.SVC(gamma=0.4, C=100) 
x, y = digits.data[:-1], digits.target[:-1] 

x = x.reshape(1,-1) 
y = y.reshape(-1,1) 
print((x)) 

classifier.fit(x, y) 
### 
print('Prediction:', classifier.predict(digits.data[-3])) 
### 
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation='nearest') 
plt.show() 

Я также переделал x и y. Тем не менее я получаю ошибку говоря:Набор данных цифр Sklearn

Найдено входной переменные с противоречивым числом образцов: [1 1796]

У имеет 1-D массив с 1796 элементами, тогда как Х имеет много. Как он показывает 1 для x?

ответ

1

На самом деле лом, что я предложил ниже:

This link describes the general dataset API. Атрибут data является 2d массива каждого изображения, уже сплющенный:

import sklearn.datasets 
digits = sklearn.datasets.load_digits() 
digits.data.shape 
#: (1797, 64) 

Это все, что вам нужно предоставить, не требуется изменения формы. Точно так же, атрибут data является 1d массива каждой метки:

digits.data.shape 
#: (1797,) 

Нет перепрофилирования необходимо. Просто разделитесь на тренировки и тестирование и бегите с ним.


Попробуйте напечатать x.shape и y.shape. Я чувствую, что вы найдете что-то вроде: (1, 1796, ...) и (1796, ...) соответственно. При вызове fit для классификаторов в scikit он ожидает двух одинаковых итераций одинаковой формы.

Разгадка, почему аргументы, когда меняют различные обходные пути:

x = x.reshape(1, -1) 
y = y.reshape(-1, 1) 

Может попробовать:

x = x.reshape(-1, 1) 

никакого отношения к вашему вопросу, но Вы прогнозируете на digits.data[-3] когда единственный элемент, оставшийся без тренировочного набора, равен digits.data[-1]. Не уверен, что это было намеренно.

Независимо от того, было бы неплохо проверить ваш классификатор на большее количество результатов, используя пакет показателей scikit. This page has an example of using it over the digits dataset.

+0

Дает ошибку: 'Найденные входные переменные с непоследовательным числом образцов: [114944, 1796]' – linthum

+0

@lithum, что результат печати 'x.shape' и' y.shape', как я предложил? – SCB

+0

@linthum Фактически внесены некоторые изменения. Мы оба ошибаемся. – SCB

0

Реорганизация преобразует вашу матрицу 8x8 в одномерный вектор, который может использоваться как функция. Вам нужно изменить весь вектор X, а не только данные обучения, так как тот, который вы будете использовать для предсказания, должен иметь тот же формат.

Следующий код показывает, как:

import matplotlib.pyplot as plt 

from sklearn import datasets 
from sklearn import svm 

digits = datasets.load_digits() 


classifier = svm.SVC(gamma=0.4, C=100) 
x, y = digits.images, digits.target 

#only reshape X since its a 8x8 matrix and needs to be flattened 
n_samples = len(digits.images) 
x = x.reshape((n_samples, -1)) 
print("before reshape:" + str(digits.images[0])) 
print("After reshape" + str(x[0])) 


classifier.fit(x[:-2], y[:-2]) 
### 
print('Prediction:', classifier.predict(x[-2])) 
### 
plt.imshow(digits.images[-2], cmap=plt.cm.gray_r, interpolation='nearest') 
plt.show() 

### 
print('Prediction:', classifier.predict(x[-1])) 
### 
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation='nearest') 
plt.show() 

Это выход:

before reshape:[[ 0. 0. 5. 13. 9. 1. 0. 0.] 
[ 0. 0. 13. 15. 10. 15. 5. 0.] 
[ 0. 3. 15. 2. 0. 11. 8. 0.] 
[ 0. 4. 12. 0. 0. 8. 8. 0.] 
[ 0. 5. 8. 0. 0. 9. 8. 0.] 
[ 0. 4. 11. 0. 1. 12. 7. 0.] 
[ 0. 2. 14. 5. 10. 12. 0. 0.] 
[ 0. 0. 6. 13. 10. 0. 0. 0.]] 
After reshape[ 0. 0. 5. 13. 9. 1. 0. 0. 0. 0. 13. 15. 10. 15. 5. 
    0. 0. 3. 15. 2. 0. 11. 8. 0. 0. 4. 12. 0. 0. 8. 
    8. 0. 0. 5. 8. 0. 0. 9. 8. 0. 0. 4. 11. 0. 1. 
    12. 7. 0. 0. 2. 14. 5. 10. 12. 0. 0. 0. 0. 6. 13. 
    10. 0. 0. 0.] 

И правильный прогноз в течение последних 2-х изображений, которые не были использованы для обучения - вы можете решить, однако чтобы сделать больший раскол между тестированием и обучением.

 Смежные вопросы

  • Нет связанных вопросов^_^