K邻近算法

1. k邻近算法概述:

k邻近算法简单直观,给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类

2. k邻近算法的模型复杂度体现在哪里?什么情况下会造成过拟合

k邻近算法模型复杂度体现在k值,k比较小时容易造成过拟合,k较大时容易造成欠拟合

3. 线性扫描算法

线性扫描算法步骤如下:

输入:训练数据集T={(x1,y1),(x2,y2),...(xn,yn)}

     待预测数据:(x_test)

     k值

(1)计算x_test与 xi的欧式距离

(2)欧式距离排序

(3)取前k个最小距离,对应训练数据点的类型y

(4)对k个y值进行统计

(5)返回频率出现最高的点

 1 import numpy as np
 2 from collection import Counter
 3 from draw import draw
 4 class KNN:
 5     def _init_(self,x_train,y_train,k=3):
 6         self.k=k
 7         self.x_train=x_train
 8         self.y_train=y_train
 9         
10     def predict(self,x_new):
11         #计算欧式距离
12         dist_list=[(np.linalg.norm(x_new=self.x_train[i],ord=2),self.y_train[i])
13                   for i in range(self.x_train.shape[0])]
14         dist_list.sort(key=lambda x: x[0])                  
15         y_list=[dist_list[i][-1] for i in range(self.k)]
16         #对上述k个点的分类进行统计
17         y_count=Counter(y_list).most_common()
18         return y_count[0][0]
19     
20 def main():
21     #首先输入训练数据
22     x_train=np.array([[5,4],
23                       [9,6],
24                       [4,7],
25                       [2,3],
26                       [8,1],
27                       [7,2]])
28     y_train=np.array([1,1,1,-1,-1,-1])
29     输入测试数据
30     x_new=np.array([5,3])
31     #绘图
32     draw(x_train,y_train,x_new)
33     for k in range(1,6,2):
34         #构建KNN实例
35         elf=KNN(x_train,y_train,k=k)
36         #对测试数据进行分类
37         y_predict=elf.predict(x_new)
38         print("k={},被分类为:{}").format(k,y_predict)
39 if __name__ == "main":
40     main()

 

posted @ 2019-05-09 10:33  Cucucu  阅读(230)  评论(0编辑  收藏  举报