KNN,K个NearestNeighbors,K个最近的邻居。KNN分类,想知道你属于哪一类,就看你最好的几个朋友是属于哪一类,那你也就八九不离十啦。
step01、找出你的K个最好朋友
step02、统计这K个好朋友大部分都属于哪一类;
step03、这大部分朋友所属的分类也就是你的分类。
如何定义好朋友呢?便是最近距离者,距离计算有欧氏距离、余弦相似度等。
理解上面3点,就可以去完成一个手动版KNN分类算法。
#加载numpy,为计算使用
import numpy as np
#加载数据
from sklearn.datasets import load_iris
# from sklearn.neighbors import KNeighborsClassifier
#切分数据
from sklearn.model_selection import train_test_split
X,y = load_iris(return_X_y = True) #只加载数据
X_train,X_test,y_train,y_test= train_test_split(X,y,test_size = 0.2)
# 开始写定义模型
class KNeighborsClassifier(object):
"""
分类器
"""
def __init__(self,n_neighbors = 5):
"""
初始化模型,定义超差数
"""
self.n_neighbors = n_neighbors
def fit(self, X, y):
"""
训练
"""
self.X = np.array(X) #把训练数据转为np 数组,方便距离计算
self.y = np.array(y)
def predict(self,X):
"""
预测
"""
X= np.array(X)
if X.ndim != 2:
raise Exception("需要二维数组")
result = [] #把所有的预测结果放在一个列表中
for x in X:
dist = np.sqrt(((self.X - x)**2).sum(axis =1)) #用测试集一一去跟训练集计算距离
args = np.argsort(a=dist)[:self.n_neighbors] #取出k(self.n_neighbors)个最近记录者
labels = self.y[args] #取出相近好朋友(训练集)的分类(标签)
result.append(max(set(labels),key=labels.tolist().count)) #求出好朋友所属分类最多那个 return np.array(result)
# 构建模型
knn = KNeighborsClassifier()
#训练模型
knn.fit(X = X_train,y=y_train)
#模型预测
y_pred = knn.predict(X=X_test)
#计算准确率
print(y_pred,y_test)
acc = (y_pred== y_test).mean()
print(acc)