python机器学习之K-近邻算法(KNN)
K-近邻算法的原理1.计算已知类别数据集中的每个点与当前点之间的距离:2.选取与当前点最近的K个点3.确定在这K个点中每种类别的频率4.选取频率最大的类别作为当前点的类别sklearn中的API
·
1.K-近邻算法的原理
给定一个样本,k-最临近分类法搜索模式空间,找出最接近未知样本的k个训练样本;通过计算每个训练数据到待分类元组的距离,取和待分类元组距离最近的K个训练数据,K个数据中哪个类别的训练数据占多数,则待分类元组就属于哪个类别。
如图:这里有1绿色的点需要需要进行分类,当K=3时,红色三角形的个数为2,蓝色正方形的个数为1,所以被分为三角形;而当K=5时,红色三角形的个数为2,蓝色正方形的个数为3,所以被分为正方形。由此可见,K值的大小对分类的结果起到至关重要的作用。
2.KNN的要点
1.计算已知类别数据集中的每个点与当前点之间的距离:
- 数据需要进行归一化处理
- 可以采用欧式距离,也可以采用曼哈顿距离。
2.从最近邻居列表中决定分类的结果
- 选出k个最近的邻居中的多数票的类标号
- 可以根据距离为每一个投票增加权重
3.K值的选取
- K值太小容易受噪声数据影响发生过拟合
- 可通过交叉验证的方法来选取最优的k值
4.KNN的不足
- 当样本不平衡时,一类样本数量很大,一类样本数量很少时,可能导致判断某个样本时,虽然离类样本少的距离小,但大容量类的样本占据较大的数量从而导致分类出错。
- 计算量较大,需要计算待分类点到全部样本点的距离。
2.sklearn中的API
K 值是通过 n_neighbors 的参数来调节的,默认为5。
主要参数介绍:
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’,
algorithm=’auto’, leaf_size=30,
p=2, metric=’minkowski’,
metric_params=None,
n_jobs=None, **kwargs)
"""
n_neighbors:K值的选择,默认为5
weight:节点权重的选择,默认是uniform,参数可以是uniform、distance,也可以是用户自己定义的函数。uniform是均等的权重,就说所有的邻近点的权重都是相等的。distance是不均等的权重,距离近的点比距离远的点的影响大。用户自定义的函数,接收距离的数组,返回一组维数相同的权重。
algorithm:快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索
leaf_size:构造树的大小,默认是30,这个是构造的kd树和ball树的大小。这个值的设置会影响树构建的速度和搜索速度,同样也影响着存储树所需的内存大小。需要根据问题的性质选择最优的大小。
metric: 字符串或可调用,默认为’minkowski’,用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度量)。
"""
KNN案例
本文为sklearn自带数据集,红酒分类案例,在处理以距离为分类标准的方法时,一般都需要用数据归一化处理,因为这里的数据已经进行了归一化,我这就进行了省略。
#KNN分红酒
import numpy as np
from sklearn.datasets.base import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
#导入数据集划分训练集和测试集
data_wine=load_wine()
print(data_wine["data"].shape)
x_train,x_test,y_train,y_test=train_test_split(data_wine["data"],data_wine["target"],test_size=0.3)
#建立KNN模型
KNN=KNeighborsClassifier(n_neighbors=5)
KNN.fit(x_train,y_train)
print("KNN的训练集的准确度",KNN.score(x_train,y_train))
y=KNN.predict(x_test)
print("测试集的准确度",accuracy_score(y,y_test))
更多推荐
已为社区贡献11条内容
所有评论(0)