from sklearn import datasets
from math import sqrt
import numpy as np
from collections import Counter
# digits=datasets.load_digits()
iris=datasets.load_iris()
# print(iris)
X=iris.data
y=iris.target
def train_test_split(X,y,test_ratio=0.2):
shuffle_indexes = np.random.permutation(len(X))
test_size = int(len(X) * test_ratio)
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
X_train = X[train_indexes]
y_train = y[train_indexes]
# print(X_train.shape)
# print(y_train.shape)
X_test = X[test_indexes]
y_test = y[test_indexes]
# print(X_test.shape)
# print(y_test.shape)
return X_train,X_test,y_train,y_test
class KNNClassifier:
def __init__(self,k):
self.k=k
self._X_train=None
self._y_train=None
def fit(self,X_train,y_train):
self._X_train=X_train
self._y_trian=y_train
return self
def predict(self,X_predict):
y_predict = [self._predict(x) for x in X_predict]
return np.array(y_predict)
def _predict(self,x):
distances = []
for x_train in self._X_train:
d = sqrt(np.sum((x_train - x) ** 2))
distances.append(d)
nearest = np.argsort(distances)
topK_y = [self._y_train[i] for i in nearest[:self.k]]
votes = Counter(topK_y)
return votes.most_common(1)[0][0]
def _repr_(self):
return "KNN(k=%d)"% self.k
X_train,X_test,y_train,y_test=train_test_split(X,y)
knn_clf=KNNClassifier(3)
knn_clf.fit(X_train,y_train)
y_predict=knn_clf.predict(X_test)
print(y_predict)
Traceback (most recent call last):
File “E:/软件/PyCharm/works/MachineL/KNN.py”, line 67, in
y_predict=knn_clf.predict(X_test)
File “E:/软件/PyCharm/works/MachineL/KNN.py”, line 46, in predict
y_predict = [self._predict(x) for x in X_predict]
File “E:/软件/PyCharm/works/MachineL/KNN.py”, line 46, in
y_predict = [self._predict(x) for x in X_predict]
File “E:/软件/PyCharm/works/MachineL/KNN.py”, line 56, in _predict
topK_y = [self._y_train[i] for i in nearest[:self.k]]
File “E:/软件/PyCharm/works/MachineL/KNN.py”, line 56, in
topK_y = [self._y_train[i] for i in nearest[:self.k]]
TypeError: ‘NoneType’ object is not subscriptable