一种基本分类与回归方法

工作原理是:1、训练样本集+对应标签 

      2、输入没有标签的新数据,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。

      3、一般来说,我们只选择样本数据集中前k个最相似的数据。

      4、选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

k-近邻算法没有进行数据的训练,直接使用未知的数据与已知的数据进行比较,得到结果。因此,可以说k-邻近算法不具有显式的学习过程。

距离度量:欧氏距离

k近邻法(k-nearest neighbor, k-NN)

工作流程:

  1. 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
  2. 准备数据:使用Python解析、预处理数据。
  3. 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
  4. 测试算法:计算错误率。
  5. 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

 

KNN算法原理代码:

 1 import numpy as np
 2 import operator
 3 
 4 def classify0(inx,dataset,labels,k):  #定义一个分类函数,测试数据,数据集,标签集,k个
 5     datasetsize = dataset.shape[0]  #获取数据集的第一维个数,为了计算测试数据与数据集中每个数据的距离
 6     diffmat = np.tile(inx,(datasetsize,1)) - dataset #将测试数据在行上重复多次,列上重复一次,也就是不重复,
 7                                                      # 这样可以与每个数据计算距离
 8     sqdiffmat = diffmat**2 #距离的平方
 9     sqdistance = sqdiffmat.sum(axis=1) # 行里的所有元素都加起来,1是行,0是列
10     distance = sqdistance**0.5  #距离的平方再开方
11     sorteddisindeces = distance.argsort() #距离进行从小到大的排序,返回的是排序后的索引值
12     classcount = {} #这个是用来记录取得前k个值后,进行排序的字典, 键:距离对应的标签,值:标签出现的次数
13     for i in range(k):
14         voteilabel = labels[sorteddisindeces[i]] #键 = 标签(前k个索引值)  键=前k个标签
15         classcount[voteilabel] = classcount.get(voteilabel,0) + 1 #        #计算前k个便签出现的次数,次数就是值
16     sortedclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True) #key=operator.itemgetter(1)定义函数,获取对象1值
17                                                                                           #按照值进行倒序排,元素格式是
18                        #{ [标签,次数],[标签,次数].......}
19     return sortedclasscount[0][0] #排完值后,将排行老一的也就是最近距离的标签
20 
21 def createDataSet():
22     #四组二维特征
23     group = np.array([[1,101],[5,89],[108,5],[115,8]])
24     #四组特征的标签
25     labels = ['爱情片','爱情片','动作片','动作片']
26     return group, labels
27 
28 if __name__ == '__main__':
29     #创建数据集
30     group, labels = createDataSet()
31     #测试集
32     test = [101,20]
33     #kNN分类
34     test_class = classify0(test, group, labels, 3)
35     #打印分类结果
36     print(test_class)
View Code

相关文章: