class KNN(object):
#构造函数
def __init__(self,n_neighbors=5):
#self.k是属性,属性在类中有点相似于全局变量的作用
self.k = n_neighbors
#训练函数 knn算法是惰性学习的机器学习方法
#所有的惰性学习 他们的训练(算法计算)都是假的 都是在预测的时间开始计算的 predict
def fit(self,X,y):
#统一数据类型
self.X_train = np.array(X)
self.y_train = np.array(y)
#预测
def predict(self,X):
#测试数据
X_test = np.array(X)
#测试数据有多少个? 获取测试样本数量
n_test_sample = X_test.shape[0]
#每一个测试数据都需要和训练数据之间测算距离
dist = self.distance(X_test,n_test_sample)
#清楚的知道一件事情,预测的目标值有多少个
y_pred = np.zeros(shape=n_test_sample,dtype='uint8')
#排序,找到离自己最近的k个数
for i in np.arange(n_test_sample):
#获取最近k个数的目标值
cls_y = self.y_train[np.argsort(dist[i])[:self.k]]
#计算类别
y_pred[i] = np.argmax(np.bincount(cls_y))
return y_pred
#计算距离 OOP思想 一个方法只做一件事
def distance(self,X_test,n_test_sample):
#训练数据样本有多少个
n_train_sample = self.X_train.shape[0]
#计算的距离是一个数组,那么这个数组的形状事什么样的
dist = np.zeros(shape=(n_test_sample,n_train_sample))
for i in np.arange(n_test_sample):
dist[i] += np.sqrt(np.sum(np.square(np.subtract(self.X_train,X_test[i])),axis=1))
return dist
#封装模型的准确率
def score(self,X,y):
y_pred = self.predict(X)
return np.mean(y_pred==y)
案例
knn_ = KNN()
knn_.fit(X_train,y_train)
knn_.score(X_train,y_train),knn_.score(X_test,y_test)
np.argmax(np.bincount(y_train[[5,3,1,7,10]]))