KNN 分类算法

KNN 分类算法


KNN(K近邻),是以近邻样本的类别的概率大小分类的。默认以距离作为权重
[url]https://www.cnblogs.com/xiaotan-code/p/6680438.html[/url]


算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。


sklearn:
KNN回归树的类是KNeighborsRegressor。除此之外,还有KNN的扩展,即限定半径最近邻分类树的类RadiusNeighborsClassifier和限定半径最近邻回归树的类RadiusNeighborsRegressor, 以及最近质心分类算法NearestCentroid。

[url]https://www.cnblogs.com/pinard/p/6065607.html[/url](使用比较)

scikit-learn里只使用了蛮力实现(brute-force),KD树实现(KDTree)和球树(BallTree)实现,

KNN算法我们主要要考虑三个重要的要素,对于固定的训练集,只要这三点确定了,算法的预测方式也就决定了。这三个最终的要素是k值的选取,距离度量的方式和分类决策规则。

KNN算法蛮力实现
既然我们要找到k个最近的邻居来做预测,那么我们只需要计算预测样本和所有训练集中的样本的距离,然后计算出最小的k个距离即可,接着多数表决,很容易做出预测。


KD树实现原理
大大节省了计算时间。
如果是KNN分类,预测为K个最近邻里面有最多类别数的类别。如果是KNN回归,用K个最近邻样本输出的平均值作为回归预测值。

球树实现原理



# -*-coding:utf-8 -*-
from sklearn import datasets
# 导入内置数据集模块
from sklearn.neighbors import KNeighborsClassifier
# 导入sklearn.neighbors模块中KNN类
import numpy as np

np.random.seed(0)
# 设置随机种子,不设置的话默认是按系统时间作为参数,因此每次调用随机模块时产生的随机数都不一样设置后每次产生的一样
iris = datasets.load_iris()
# 导入鸢尾花的数据集,iris是一个类似于结构体的东西,内部有样本数据,如果是监督学习还有标签数据
iris_x = iris.data
# 样本数据150*4二维数据,代表150个样本,每个样本4个属性分别为花瓣和花萼的长、宽
iris_y = iris.target
# 长150的以为数组,样本数据的标签
indices = np.random.permutation(len(iris_x))
# permutation接收一个数作为参数(150),产生一个0-149一维数组,只不过是随机打乱的,当然她也可以接收一个一维数组作为参数,结果是直接对这个数组打乱
iris_x_train = iris_x[indices[:-10]]
# 随机选取140个样本作为训练数据集
iris_y_train = iris_y[indices[:-10]]
# 并且选取这140个样本的标签作为训练数据集的标签
iris_x_test = iris_x[indices[-10:]]
# 剩下的10个样本作为测试数据集
iris_y_test = iris_y[indices[-10:]]
# 并且把剩下10个样本对应标签作为测试数据及的标签

knn = KNeighborsClassifier()
# 定义一个knn分类器对象
knn.fit(iris_x_train, iris_y_train)
# 调用该对象的训练方法,主要接收两个参数:训练数据集及其样本标签
iris_y_predict = knn.predict(iris_x_test)
print('iris_y_predict = ')
print(iris_y_predict)
# [1 2 1 0 0 0 2 1 2 0]
# 调用该对象的测试方法,主要接收一个参数:测试数据集
print('iris_y_test = ')
print(iris_y_test)
# [1 1 1 0 0 0 2 1 2 0]

probility = knn.predict_proba(iris_x_test)
print('probility = ')
print(probility)
# [[0. 1. 0. ]
# [0. 0.4 0.6]
# [0. 1. 0. ]
# [1. 0. 0. ]
# [1. 0. 0. ]
# [1. 0. 0. ]
# [0. 0. 1. ]
# [0. 1. 0. ]
# [0. 0. 1. ]
# [1. 0. 0. ]]

# 计算各测试样本基于概率的预测

score = knn.score(iris_x_test, iris_y_test, sample_weight=None)
# 调用该对象的打分方法,计算出准确率
print('score = ')
print(score)
# 0.9
print(iris_x_test[2])
# [6.3,2.3,4.4,1.3]
testData = [[6.3,2.3,4.4,1.3]]

# n_neighbors=None,表示需要寻找目标样本最近的几个最近邻样本,默认为None,需要调用时给出。return_distance=True:是否需要同时返回具体的距离值。
neighborpoint = knn.kneighbors(testData,5,True)
print('neighborpoint = ')
print(neighborpoint)
# (array([[0.26457513, 0.57445626, 0.59160798, 0.60827625, 0.6164414 ]]), array([[ 79, 132, 1, 13, 27]], dtype=int64))
# neighborpoint = knn.kneighbors(iris_x_test,5,False)
# 计算与最后一个测试样本距离在最近的5个点,返回的是这些样本的序号组成的数组

# 输出准确率计算结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值