网站云主机,icp备案网站接入信息怎么写,广州做手机网站咨询,网上开店铺kNN的算法思路#xff1a;找K个离预测点最近的点#xff0c;然后让它们进行投票决定预测点的类型。
step 1: kNN存储样本点的特征数据和标签数据step 2: 计算预测点到所有样本点的距离#xff0c;关于这个距离#xff0c;我们用欧几里德距离来度量#xff08;其实还有很多…kNN的算法思路找K个离预测点最近的点然后让它们进行投票决定预测点的类型。
step 1: kNN存储样本点的特征数据和标签数据step 2: 计算预测点到所有样本点的距离关于这个距离我们用欧几里德距离来度量其实还有很多其他的比如曼哈顿距离等并进行排序拿出前k个样本点。step 3: 统计前k个样本点的类别以最多的那个类型作为预测结果。
欧几里德距离
上代码
import numpy as np
# 用于统计
from collections import Counterclass MyKnn:# 初始化投票的数量neighbors表示我们要找的点的数量用于投票决定预测点的类型def __init__(self,neighbors):self.k neighbors# 因为kNN是一个惰性机器性学习模型只在预测阶段才会用到的训练数据不存在训练阶段。或者说在所谓的训练阶段只是为了存储样本数据。# X为特征集# Y为对应的标签集def fit(self,X,Y):self.X np.array(X)self.Y np.array(Y)# 如果特征集不是矩阵阵列或则标签集不是一维数组都直接抛异常。if self.X.ndim ! 2 or self.Y.ndim ! 1:raise Exception(dimensions are wrong!)# 如果标签的数量不竺于特征集的行数也直接抛异常if self.X.shape[0] ! self.Y.shape[0]:raise Exception(input labels are not correct!)def predict(self,X_pre):# 这是要预测的点pre np.array(X_pre)# 判断测试点的矩阵是不是和样本点的矩阵一样的不是直接抛异常if self.X.ndim ! pre.ndim:raise Exception(input dimensions are wrong!)# 我们用rs数组来存储预测结果rs []for p in pre:# 用temp临时数组来存储预测点到所有样本点的欧几里德距离temp []for a in self.X:# 取出每一个样本点来与预测点计算欧几里德距离# np.sqrt(((p - a) ** 2).sum(-1)) 算出距离先求出每预测点到样本点的差值再平方再将所有平方后的值加在一起最后对加起来的结果进行开方得到欧几里德距离。并临时存储在temp数组里temp.append(np.sqrt(((p - a) ** 2).sum(-1)))temp np.array(temp)# 对所有距离进行排序用np.argsort排序时结果对识破距离的下标而不是具体的值因为我们并不关心具体的值我们只要前k个点。用np.argsort排序完取出前k个点的indices就是下标neighbors_indices np.argsort(temp)[:self.k]# 通过前k个点的下标取出相应的标签然后用Counter进行统计这个就是计票环节ss np.take(self.Y,neighbors_indices)# 我们开始计票取出票数第一的标签值。# e.g: Counter(ss) - {2: 4, 1: 1} 表示标签值为2的得4示标签为1的得1票# most_common(1) - [(2, 4)] , 所以most_common(1)[0][0]的值就是 2found Counter(ss).most_common(1)[0][0]# 预测结果存储到rs数组中rs.append(found)return rs欧几里德距离的计算
测试上面的kNN算法
# 用鸢尾花数据集来验证我们上面写的算法
from sklearn.datasets import load_iris
# 使用train_test_split对数据集进行拆分一部分用于训练一部分用于测试验证
from sklearn.model_selection import train_test_split
# 1.生成一个kNN模型
myknn MyKnn(5)
# 2.准备数据集特征集X_train和标签集y_train
X_train,y_train load_iris(return_X_yTrue)
# 留出30%的数据集用于验证测试
X_train,X_test,y_train,y_test train_test_split(X_train,y_train,test_size0.3)
# 3.训练模型
myknn.fit(X_train,y_train)
# 4.预测acc就是预测结果
acc myknn.predict(X_test)
# 计算准确率
(acc y_test).mean()acc y_test 得到的结果是
array([ True, True, True, True, True, True, True, True, True,True, True, True, True, True, True, True, True, True,True, True, True, True, True, True, True, True, True,True, True, True, True, True, True, True, True, True,False, True, True, True, True, True, True, True, True])True 是1False是0准确率就是
正确的个数 / 总数 准确率
用余弦相似度实现kNN算法