班级 | 机器学习实验-计算机18级 |
---|---|
实验内容 | K-近邻算法及应用 |
姓名 | 郭晓 |
学号 | 3180701134 |
【实验目的】
1.理解K-近邻算法原理,能实现算法K近邻算法;
2.掌握常见的距离度量方法;
3.掌握K近邻树实现算法;
4.针对特定应用场景及数据,能应用K近邻解决实际问题。
【实验内容】
1.实现曼哈顿距离、欧氏距离、闵式距离算法,并测试算法正确性。
2.实现K近邻树算法;
3.针对iris数据集,应用sklearn的K近邻算法进行类别预测。
4.针对iris数据集,编制程序使用K近邻树进行类别预测。
【实验报告要求】
1.对照实验内容,撰写实验过程、算法及测试结果;
2.代码规范化:命名规则、注释;
3.分析核心算法的复杂度;
4.查阅文献,讨论K近邻的优缺点;
5.举例说明K近邻的应用场景。
实验代码:
import math from itertools import combinations
def L(x,y,p=2): #计算两点之间的长度函数(明氏距离公式,默认p=2时用欧拉距离公式) #x1=[1,1],x2=[5,1] if len(x)==len(y) and len(x)>1: sum=0 for i in range(len(x)): sum+=math.pow(abs(x[i]-y[i]),p) return math.pow(sum,1/p) else: return 0
x1=[1,1] #例子 x2=[5,1] x3=[4,4]
#计算x1与x2、x3之间的距离 for i in range(1,5): r={'1-{}'.format(c):L(x1,c,p=i) for c in [x2,x3]}#计算p取不同值时对应的距离 print(min(zip(r.values( ),r.keys( ))))
运行结果:
#python实现遍历所有数据点,找出n个距离最近的点的分类情况,少数服从多数 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from collections import Counter iris = load_iris() #导入数据 df = pd.DataFrame(iris.data, columns=iris.feature_names)#定义一个DataFrame变量 df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']#列名 # data = np.array(df.iloc[:100, [0, 1, -1]])
运行结果:
9、
10
11、
12、
13、
14、
15、
16、
17、
18、
19、
20、
21、
22、
23、
24、
优点
1.简单易用
2.没有显式的训练过程,在训练过程中仅仅是把训练样本保存起来,训练时间开销为0,是懒惰学*(lazy learning) 的著名代表 。
3.预测效果好
4.对异常值不敏感
缺点
1、效率低
2、具有高度数据相关
3、预测结果不具有可解释性
1、python中的文本自动分类
2、社交网站的数据分类
3、手写识别系统的数据分类