KNN算法
1 KNN的介绍
核心思想:给定一个预测目标,接下来计算预测目标和所有样本之间的距离或者相似度,然后选择距离最近的前K个样本,然后通过这些样本来投票决策。
一般对于二分类问题来说,把K设置为奇数是容易防止平局的现象。但对于多分类来说,设置为奇数未必一定能够防平局。
代码实现:
#iris数据集是开源数据中最为重要的数据集之一。这个数据包含了3个类别,所以适合的问题是分类问题。
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 从print(x,y)结果可以看到X拥有四个特征,并且标签y拥有0,1,2三种不同的值。
# 在这里X存储的是数据的特征,y存储的每一个样本的标签或者分类。我们使用 train_test_split来把数据分成了训练集和测试集。主要的目的是为了在训练过程中也可以验证模型的效果。如果没有办法验证,则无法知道模型训练的好坏。
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=2003)
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train,y_train)
这里的random_state就像随机生成器中的seed。通过不同的值采样的训练数据和测试数据是不一样的。设定一个固定的random_state有助于诊断程序本身,因为每次所期待的结果都会一样。
# 计算准确率
correct = np.count_nonzero((clf.predict(X_test)==y_test))
print("Accuacy is:%.3f"%(correct/len(X_test)))
Accuacy is:0.921
为了实现一个KNN算法,我们需要具备四个方面的信息。
- 把一个物体表示成向量
- 标记好每个物体的标签
- 计算两个物体之间的距离/相似度
- 选择合适的K
第一、任何的算法的输入一定是数量化的信息,我们把它叫做特征,需要把现实生活中的物体通过数字化的特征来进行描述。
第二、由于KNN是监督学习算法,所以需要提前标注好的样本。
第三、我们需要想办法来计算两个样本之间的距离或者相似度,之后才能选出最相近的样本。
第四、需要知道如何选择最合适的K值,那为了理解这一点首先要理解K对模型本身的影响。
自己手动写一个KNN算法解决分类问题:
from sklearn import datasets
from collections import Counter # 为了做投票
from sklearn.model_selection import train_test_split
import numpy as np
# 导入iris数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)
def euc_dis(instance1, instance2):
"""
计算两个样本instance1和instance2之间的欧式距离
instance1: 第一个样本, array型
instance2: 第二个样本, array型
"""
# TODO
dist = np.sqrt(sum((instance1 - instance2)**2))
return dist