K-近邻算法(懒惰算法)

k—近邻算法

简介:

K Nearest Neighbor算法又叫KNN算法,如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。

该算法的思想是:

一个样本与数据集中的k个样本最相似,如果这k个样本中的大多数属于某一个类别,则该样本也属于这个类别,即,对每一个测试样本,基于事先选择的距离度量,KNN算法在训练集中找到距离最近(最相似)的k个样本,然后将k个样本的类别的投票结果作为测试样本的类别。

K 近邻算法api调用

1、scikit_learn
2、api
3、模型训练具体使用
4、knn算法是一个懒惰算法,根据给出的样本自己进行判断,比较耗时

举例:	

		# 导入模块
		from sklearn.neighbors import KNeihborsClassifier 
		# 构造数据集
		x = [[0],[1],[2],[3]]
		y = [0,0,1,1]
		# 机器学习--模型训练
		# 实例化api
		estimator = KNeighborsClassifier(n_neighbors=2)
		# 使用fit方法进行训练
		estimator.fit(x,y)
		
	实际计算流程:

		1)计算已知类别数据集中的点与当前点之间的距离

		2)按距离递增次序排序

		3)选取与当前点距离最小的k个点

		4)统计前k个点所在的类别出现的频率

		5)返回前k个点出现频率最高的类别作为当前点的预测分类

距离度量距离

1、欧式距离

 就是通过平方,求和,然后开根号进行求解

2、曼哈顿距离

就是通过绝对值,求和进行求解

3、切比雪夫距离

就是通过绝对值,然后取最大值

4、闵可夫斯基距离

是前三个距离的一个综合称呼

p = 1时,就是曼哈顿距离;

p = 2时,就是欧式距离;

p = ∞时,就是切比雪夫距离。

前四个距离的总结:1)将各个分量的量纲,也就是“单位”相同的看待了;2)未考虑各个分量的分布(期望、方差等)可能是不用的。

5、马氏距离

是基于样本分布的一个距离,在计算过程中,与量纲无关。要求:总体样本数大于样本的维数(特征值)

6、标准化欧氏距离

在使用欧式距离计算之前把每个维度的特征求了标准化

7、汉明距离

就是计算字符串替换的一个长度(次数),【汉明重量】

8、杰卡德距离

通过数据的交集和并集进行求解

k值的选择

如果k值过小:
容易受到异常点的影响,意味着整体模型变得复杂,容易发生过拟合

若k值过大:
容易受到样本均衡的问题,k值增大就意味着整体模型变得简单,容易发生欠拟合

k=N(N为训练样本个数)
此时训练的模型完全失效,判断的类别只会选择样本中样本数据最多的类别

个人理解:这个k值的选择方面,可以把k值当做之前的特征,在模型训练时,特征过少会导致过拟合,特征过多会导致欠拟合。

kd树

目标:对训练数据进行快速k近邻搜索

实现思路:

1、构建树

1)构造根节点

2)通过递归方式不断的构造

3)直到子区域没有实例(节点)停止

2、最近领域搜索

1)构造一个队列,使遍历过的点在这个队列里面

2)进行是否过了超平面的判断,如果没有过,跳过,若过了,则需要把当前的子节点添加进去

3)循环操作,求得最近点

坐标系解释:找到对应的近邻点,与目标点距离画圆,判断圆形内是否还有其他节点,若有,则元缩小至最近的近邻点,替换掉上一个近邻点的最近距离,直至圆内不存在节点,最后一个近邻点则为最近的节点。

附加案例

鸢尾花种类预测

基本实现流程:

1、获取数据集

2、数据基本处理

	1)数据集分隔

3、特征工程

4、机器学习

5、模型评估

# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1、获取数据集
iris = load_iris()

# 2、数据的预处理
# x_train,x_test,y_train,y_test为训练集特征值,测试集特征值,训练值目标值,测试目标值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)

# 3、特征工程标准化
transfer = StandardScaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=5)
estimator.fit(x_train,y_train)
# 5、模型评估
# 1)比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n",y_predict)
print("比对真实值和预测值:\n",y_predict == y_test)
# 2)直接 计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n",score)
交叉验证、网格搜索(模型选择与调优)API:

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

  • 对估计器的指定参数值进行详尽搜索
  • estimator:估计器参数(dict){“n_neighbors”:[1,3,5]}
  • cv:指定几折交叉验证
  • fit:输入训练数据
  • score:准确率
  • 结果分析:
    • bestscore__:在交叉验证中验证的最好结果
    • beststimator:最好的参数模型
    • cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果
鸢尾花案例增加K值调优
# 使用GridSearchCV构建估计器
# 导入模块
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1、获取数据集
iris = load_iris()

# 2、数据的预处理
# x_train,x_test,y_train,y_test为训练集特征值,测试集特征值,训练值目标值,测试目标值
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.2,random_state=22)

# 3、特征工程标准化
transfer = StandardScaler()
x_train = trasfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4、机器学习(模型训练)
# 1)KNN预估器流程
estimator = KNeighborsClassifier()
# 2)准备要调的参数
param_dict = {"n_neighbors":[1,3,5]} 
estimator = GridSearchCV(estimaor, param_grid=param_dict, cv=3)
# 3)fit数据进行训练
estimator.fit(x_train,y_train)
# 5、模型评估
# 1)比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n",y_predict)
print("比对真实值和预测值:\n",y_predict == y_test)
# 2)直接 计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n",score)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值