最近邻分类器的Python属性错误

最近邻分类器的Python属性错误,python,python-3.x,scikit-learn,Python,Python 3.x,Scikit Learn,在这里获取属性错误 我似乎找不到最近邻分类器的这种实现有什么问题。使用不同的分类器,我已经有了一个非常好的工作,准确率>90%,所以它真的必须是第14行。任何帮助都将不胜感激,请尝试确保它在Python3中运行 第14行: label = self.closest(row) 我得到一个错误: AttributeError:'DavesKNN'对象没有属性'closest' 完整代码: from scipy.spatial import distance def euc(a,b): r

在这里获取属性错误

我似乎找不到最近邻分类器的这种实现有什么问题。使用不同的分类器,我已经有了一个非常好的工作,准确率>90%,所以它真的必须是第14行。任何帮助都将不胜感激,请尝试确保它在Python3中运行

第14行:

label = self.closest(row)
我得到一个错误:

AttributeError:'DavesKNN'对象没有属性'closest'

完整代码:

from scipy.spatial import distance

def euc(a,b):
    return distance.euclidean(a,b)

class DavesKNN():
    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def predict(self, X_test):
        predictions = []
        for row in X_test:
            label = self.closest(row)
            predictions.append(label)
        return predictions

        def closest(self, row):
            best_dist = euc(row, self.X_train[0])
            best_index = 0
            for i in range(1, len(self.X_train)):
                dist = euc(row, self.X_train[i])
                if dist < best_dist:
                    best_dist = dist
                    best_index = i
            return self.y_train[best_index]

#Import a Dataset
from sklearn import datasets
iris = datasets.load_iris()

# Features and Labels
X = iris.data
y = iris.target

# Partition Features and Labels into New Sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .5)

# from sklearn.neighbors import KNeighborsClassifier
# my_classifier = KNeighborsClassifier()
my_classifier = DavesKNN()

my_classifier.fit(X_train, y_train)

predictions = my_classifier.predict(X_test)

from sklearn.metrics import accuracy_score
print (accuracy_score(y_test, predictions))
从scipy.spatial导入距离
def euc(a、b):
返回距离。欧几里德(a,b)
类DavesKNN():
def配合(自身、X_系列、y_系列):
self.X_train=X_train
self.y_train=y_train
def预测(自我、X_测试):
预测=[]
对于X_测试中的行:
标签=自最近(行)
预测。追加(标签)
回归预测
def最近(自身,行):
最佳距离=euc(行,self.X\u列[0])
最佳指数=0
对于范围内的i(1,len(self.X_train)):
dist=euc(行,自X_列[i])
如果距离<最佳距离:
最佳距离
最佳指数=i
返回自我。y_列车[最佳索引]
#导入数据集
从sklearn导入数据集
iris=数据集。加载\u iris()
#功能和标签
X=iris.data
y=iris.target
#将要素和标签划分为新的集合
从sklearn.model\u选择导入列车\u测试\u拆分
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y,测试大小=.5)
#从sklearn.neighbors导入KNeighborsClassifier
#my_分类器=KNeighborsClassifier()
my_分类器=DavesKNN()
my_classifier.fit(X_train,y_train)
预测=我的分类器。预测(X_测试)
从sklearn.metrics导入准确性\u分数
打印(准确度评分(y检验、预测))

您尚未为DavesKNN()定义“最近”属性。这意味着类似于一个函数,在初始化类时,必须传递属性
最近的
。如果要从其他地方复制DavesKNN(),则需要导入该文件

要详细说明如何合并最近的
属性,请执行以下操作:

您需要在类的开头添加一个
\uuuuu init\uuuu()
函数,这样您就可以将属性传递到括号内并按如下方式声明它们:

def __init__(self, closest):
    self.closest = closest

在类内部。

“def closest(self,row):”在不应该缩进的时候刚刚缩进。我觉得自己像个白痴。它现在可以工作。

它现在告诉我TypeError:\uuuu init\uuuu()缺少1个必需的位置参数:“最近的”右键。这是因为您必须修改初始化DavesKNN()对象的行以包含最接近的变量,并且必须有一个最接近的变量