机器学习实践篇第二篇-KNN算法学习

一.了解什么是K-NN算法

   1.KNN算法原理

  KNN(K-Nearest Neighbor)算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。

KNN算法的思想非常简单:对于任意n维输入向量,分别对应于特征空间中的一个点,输出为该特征向量所对应的类别标签或预测值。

KNN算法是一种非常特别的机器学习算法,因为它没有一般意义上的学习过程。它的工作原理是利用训练数据对特征向量空间进行划分,并将划分结果作为最终算法模型。存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

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

 2.KNN算法三要素:k值的选取,距离度量的方式和分类决策规则。

    3.K值的选择方法:

  一种常见的方法是从k等于训练集中样本数量的平方根开始。比如训练集中有100个案例,则k可以从10开始进行进行进一步筛选。
另一种方法是基于各种测试数据测试多个k值,并选择一个可以提供最好分类性能的k值。除非数据的噪声非常大,否则大的训练集可以使k值的选择不那么重要。
还有一种方法是选择一个较大的k值,同时用一个权重投票,在这个过程中,认为较近邻的投票比远的投票权重更大。
   4.距离度量的方式

  距离度量的方式有三种:欧式距离、曼哈顿距离、闵可夫斯基距离。

二.KNN算法的实现​

  这里我们对海伦问题进行讨论,看看是如何解决海伦问题的。

  海伦一直使用在线约会网站寻找适合自己的约会对象。她曾交往过三种类型的人:

    • 不喜欢的人
    • 一般喜欢的人
    • 非常喜欢的人

  这些人包含以下三种特征

    • 每年获得的飞行常客里程数
    • 玩视频游戏所耗时间百分比
    • 每周消费的冰淇淋公升数

  该网站现在需要尽可能向海伦推荐她喜欢的人,需要我们设计一个分类器,根据用户的以上三种特征,识别出是否该向海伦推荐。

 1.使用python导入数据集 

复制代码
from numpy import *
import operator
 
def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels
 
group, labels = createDataSet()
print(group)
print(labels)
import matplotlib.pyplot as plt
 
def createDataSet():
    group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels
 
def plotDataSet(group, labels):
    label_dict = {'A': 'red', 'B': 'blue'}
    colors = [label_dict[label] for label in labels]
    fig, ax = plt.subplots()
    ax.scatter(group[:, 0], group[:, 1], c=colors)
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_title('Data Set')
    plt.show()
 
group, labels = createDataSet()
plotDataSet(group, labels)
复制代码

 

  2.构建KNN算法

  

复制代码
def classify0(inX, dataSet, labels, k):
    #numpy函数shape[0]返回dataSet的行数
    dataSetSize = dataSet.shape[0]
    #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    #二维特征相减后平方
    sqDiffMat = diffMat**2
    #sum()所有元素相加,sum(0)列相加,sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #开方,计算出距离
    distances = sqDistances**0.5
    #返回distances中元素从小到大排序后的索引值
    sortedDistIndices = distances.argsort()
    #定一个记录类别次数的字典
    classCount = {}
    for i in range(k):
        #取出前k个元素的类别
        voteIlabel = labels[sortedDistIndices[i]]
        #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
        #计算类别次数
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    # import pdb
    # pdb.set_trace()
    #返回次数最多的类别,即所要分类的类别
    return sortedClassCount[0][0]
复制代码

三.总结

  经过对KNN算法的学习后,我学会了一种用于分类和回归的统计方法,KNN算法是一种简单而直观的分类算法,其基本思想是通过找到与待分类样本最近的K个已知类别样本来确定其类别。其主要优点是实现简单、可解释性强,并且适用于多分类问题和非线性分类问题。但是,KNN算法的缺点也很明显,主要包括计算复杂度高、需要大量的存储空间等。世界上没有完美的算法,每个算法都有优有劣,但KNN算法较为简单,对于我们刚入门的新手来说比较适合,KNN算法虽然有一些局限性和缺点,但是在实际应用中仍然具有很大的价值和意义。理解KNN算法的基本思想,掌握其实现方法和优化技巧,可以对我们进一步学习和应用其他机器学习算法提供很好的基础。
参考文献:KNN算法原理-CSDN博客

posted @   Linglo  阅读(43)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示