#python #numpy
#python #numpy
Вопрос:
Это простая задача о kNN, и я новичок в pyhton.
# coding=utf-8
from numpy import *
import operator
def createDataSet():
group = array([[112, 110], [128, 162], [83, 206], [142, 267], [188, 184], [218, 268], [234, 108], [256, 146], [
333, 177], [350, 86], [364, 237], [378, 117], [409, 147], [485, 130], [326, 344], [387, 326], [378, 435], [434, 375]])
labels = [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
return group, labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
tempSet = array(tile(inX, (dataSetSize, 1)))
diffMat = tempSet - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndices = distances.argsort()
classCount = {}
for i in range(k):
voteLabel = labels[sortedDistIndices[i]]
classCount[voteLabel] = classCount.get(voteLabel, 0) 1
sortedClassCount = sorted(classCount.iteritems(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
# TRY1
# def with_intput():
# sample = array(raw_input('Enter you data:'))
# group, labels = createDataSet()
# sampleClass = classify0(sample, group, labels, 3)
# print sampleClass
# with_intput()
# TRY1
# TRY2
# sample = array(raw_input('Enter your sample data:'))
# group, labels = createDataSet()
# sampleClass = classify0(sample, group, labels, 3)
# print sampleClass
# TRY2
Есть что-то действительно странное. Я создал функцию с именем classify0() , но если я вызову ее во время написания кодов (раскомментирую #TRY1) или использую ее для проверки (если раскомментирую #TRT2), она вернет ошибку при запуске этого файла.
Появляется нравится:
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
Вот трассировка TRY1:
Traceback (most recent call last):
File "C:UserszhongzhengDesktopML_Codetemp2.py", line 39, in <module>
with_intput()
File "C:UserszhongzhengDesktopML_Codetemp2.py", line 36, in with_intput
sampleClass = classify0(sample, group, labels, 3)
File "C:UserszhongzhengDesktopML_Codetemp2.py", line 17, in classify0
diffMat = tempSet - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
И трассировка TRY2:
Traceback (most recent call last):
File "C:UserszhongzhengDesktopML_Codetemp2.py", line 46, in <module>
sampleClass = classify0(sample, group, labels, 3)
File "C:UserszhongzhengDesktopML_Codetemp2.py", line 17, in classify0
diffMat = tempSet - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
Но если я сохраню файл без раскомментирования TRT1 или TRY2, сохраните и запустите файл только с двумя функциями в нем, затем введите эти команды построчно в интерактивном режиме в cmd или ipython:
>>>group,labels = createDataSet()
>>>sampleClass = classify0(array([111,111]), group, labels, 3)
>>>print sampleClass
Это будет работать просто отлично.
Не могу понять, почему.
Еще один вопрос, почему мой sublime3 (subliemlinter, установлен pep8linter) продолжает предупреждать from numpy import *
или import numpy
или import numpy as np
неправильно.
Спасибо за ваше терпение.
Комментарии:
1. Можете ли вы включить обратную трассировку?
2. Ответ на ваш «еще один вопрос» заключается в том, что обычно вы не хотите
import *
использовать такой модуль, как numpy — это затрудняет понимание того, какиеnumpy
функции вы на самом деле используете, и вы можете затенять встроенные имена.3. Извините, я слишком легкомысленный. @JoseRaulBarreras
4. Спасибо, я понимаю! Мой sublime 3 не предупреждал об использовании `import numpy’ и ‘import numpy as np’, просто предупредил, что я не использовал их после импорта. @exp1orer
Ответ №1:
Ваш raw_input не принимает то, что вы ожидаете, в качестве входных данных для функции classify0.
sample = array(raw_input('Enter you data:'))
Это даст что-то вроде [«111 111»]
sample = [int(x) for x in raw_input().split()]
Это дало бы [111,111]
Вы также можете изменить разделитель на split on , т. Е. Использовать a , если ввод разделен запятой