原生python实现knn算法

一.作业题目

题目:原生python实现KNN分类算法,用鸢尾花数据集。

KNN算法:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

二.算法设计

算法实现步骤:

1、准备数据集;

2、对某一个需分类的样本数据计算其与特征样本中的各个类别的距离,如:欧式距离;

欧氏距离,最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,…,xn) 和 y = (y1,…,yn) 之间的距离为:

3、将距离从小到大进行排序,选择前K个最近的类别;

4、对K个类别按所属类别进行计数,个数最多的类别即为当前样本所属类别;

三.源代码

import pandas as pd
from sklearn import datasets  #导入鸢尾花数据集
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(X[0:10])
print(y[0:10])
print(iris.DESCR)
# 拆分训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
print(X_train[0:10])
print(y_train[0:10])
std = StandardScaler()
X_train = std.fit_transform(X_train)
X_test = std.transform(X_test)
print(X_train[0:10])
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train) #基于训练集构建模型
# 预测
y_predict = knn.predict(X_test[0:10])
print("实际结果", y_test[0:10])
print("预测结果", y_predict)
# 评分
print("准确率", knn.score(X_test, y_test))

四.测试用例设计及调试过程截屏

直接从sklearn库中导入鸢尾花数据集,采用score方法来计算测试集的精度

调试截屏:

原生python实现knn算法_第1张图片

运行结果:

原生python实现knn算法_第2张图片

五.总结

1.K值选择:(1)K值过小,特征空间被划分为更多子空间,整体模型变复杂,容易发生过拟合,k值越小,选择的范围就比较小,训练的时候命中率较高,近似误差小,而用test的时候就容易出错,估计误差大,容易过拟合;

(2)选择较大的k值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少泛化误差,但缺点是训练误差会增大。

2.在Windows下Python使用open()函数打开文件时会默认使用gbk解码,即使文件本身存储为UTF-8格式,

将Python 中with open('temp.txt', 'r') as f:

改为:with open('temp.txt','r',encoding='utf-8') as f:

但最终的算法实现并没有采用自己的鸢尾花数据集。

3.使用python以前只是完成了一些简单的算法,不熟练的语法知识在编码中遇到很多困难,python还有待深入学习。

你可能感兴趣的:(原生python实现knn算法)