机器学习算法之KNN最近邻详解和python实现

作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处


目录

概念

KNN相关的三个事情 

1.K值的确定

2.距离的度量

计算距离注意一定要做数据缩放:归一化和标准化

3.分类判别的方式方案

算法基本步骤:

算法python实现

优缺点

优点

缺点 


概念

        KNN,K-NearestNeighbor——K最近邻
        K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。 

机器学习算法之KNN最近邻详解和python实现_第1张图片

        该方法的思路是:如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.它不具有显示的学习过程。

        在 KNN中,通过计算对象间的距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离,对于文本分类来说,使用余弦来计算相似度就比欧式距离更合适:同时,KNN 通过依据 k 个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是 KNN 算法的优势。

KNN相关的三个事情 

1.K值的确定

        吴恩达的机器学习课程中,有一个方法。就是尝试不同的k直,然后把误差对应k值的图画出来。一般k值越大,平均误差约小。如果图有明显的拐点,那么这个点对应的k就是一个比较合适的k值,很多情况下靠经(xia)验(meng)来确定,没有固定的经验,一般根据样本的分布,选择一个较小的值,可以通过交叉验证选择一个合适的k值,一般采用5折(10折)交叉验证选择一个最优的准确率最高的k值。

        选择较小的k值,就相当于用较小的领域中的训练实例进行预测,训练误差会减小,容易发生过拟合。选择较大的k值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少泛化误差,但缺点是训练误差会增大。

2.距离的度量

        欧氏距离机器学习算法之KNN最近邻详解和python实现_第2张图片

        曼哈顿距离

计算距离注意一定要做数据缩放:归一化和标准化

3.分类判别的方式方案

        多数表决法和平均值两种方案。

算法基本步骤:

1)计算待分类点与已知类别的点之间的距离
2)按照距离递增次序排序
3)选取与待分类点距离最小的k个点
4)确定前k个点所在类别的出现次数
5)返回前k个点出现次数最高的类别作为待分类点的预测分类  

算法python实现

"""
knn
样本集
X = [[1,1],[1,2.5],[3,2],[4.5,3],[4,5]]
Y =['A','A','B','B','B']
测试样本:
t=[3,2.5] 属于哪个类型
设k=3
knn的实现:
    将待测试样本和所有的训练进行计算,找出最短的k个元素
    然后投票
"""
import numpy as np
import operator
X = np.array([[1,1],[1,2.5],[3,2],[4.5,3],[4,5]])
Y = np.array(['A','A','B','B','B'])

def knn_clasification(X,Y,k,testSample):
    """
    :param X: 输入数据
    :param Y: 真实数据
    :param k: 邻居的个数
    :param testSample: 待测试样本
    :return: 返回待测试样本类别
    """
    # 1.求待测试样本和所有训练样本之间的距离
    dist = np.sum((X-testSample)**2, axis=1)**0.5
    # 2.距离排序
    sort_dist = np.argsort(dist)
    # 3.统计距离最近得k个样本的类别的个数
    class_count = {}
    for dist_index in sort_dist[:k]:
        label = Y[dist_index]
        class_count[label] = class_count.get(label,0)+1
    return sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)[0][0]


if __name__ == "__main__":
    predict = knn_clasification(X, Y, 3, np.array([3, 2]))
    print(predict)

优缺点

优点

1.简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
2.可用于数值型数据和离散型数据;
3.训练时间复杂度比支持向量机之类的算法低,仅为O(n);
4.和朴素贝叶斯之类的算法比,对数据没有假设,准确度高, 对异常点不敏感;

缺点 

1.计算复杂性高;空间复杂性高,KD树,球树之类的模型建立需要大量的内存;
2.样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);
3.一般数值很大的时候不用这个,计算量太大。但是单个样本又不能太少 否则容易发生误分。
4.最大的缺点是无法给出数据的内在含义,可解释性不强。
5.使用懒散学习方法,基本上不学习,导致预测时 速度比起逻辑回归之类的算法慢

【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】  

你可能感兴趣的:(python,机器学习,机器学习,算法,人工智能)