KNN算法初步实现

"""
KNN算法简介:k近邻算法是一种基本分类与回归的方法。即:给定一个训练数据集,对新输入的实例,在训练集中找到与该实例最邻近的k个实例,这k个实例的多数
属于某个类,就把该输入实例归为这个类。简单来说就是离谁最近谁就最有可能是谁。

    优点:1、算法简单,易于实现
          2、不需要产生额外的数据来描述规则
          3、最直接的利用了样本之间的关系,减少了类别特征选择不当对分类结果造成的不利影响,可以最大程度地减少分类过程中的误差
          4、K近邻法在类别决策上,只与少量的相邻样本有个。因此,可以避免样本数量的不平衡问题


    缺点 :1、计算量大、耗时长
           2、k值的选择对结果的影响很大。若偏小,则会容易发生过拟合、使模型整体变得复杂;若偏大,则会导致学习的近似误差增大。
           3、样本的特征也会对分类过程产生影响。某些特征与分类是强相关的,某些是弱相关的,还有的是不相关的,在计算近似度是时,按所有特征作用
           相同来计算样本相似度会对分类过程产生不良影响。

    数学知识:
            欧几里得距离:
            二维空间的公式:
                    0ρ = sqrt( (x1-x2)^2+(y1-y2)^2 ) |x| = √( x2 + y2 )
            三维空间的公式
                    0ρ = √( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 ) |x| = √( x2 + y2 + z2 )
            曼哈顿距离:
                    d(i,j)=|x1-x2|+|Y1-Y2|
"""
from numpy import *
#定义训练集
def get_trainData():
    trainData = ([1.3,3.2], [2.1,1.4], [5.0,9.3], [5.1,9.7], [8.5,1.1], [9.1,1.4])
    labels = ['A', 'A', 'B', 'B', 'C', 'C']
    return trainData, labels

#KNN算法

def KNN(input, tradata, label, K):
    dist = []
    for i in range(len(tradata)):
        x = tradata[i][0] - input[0]
        y = tradata[i][1] - input[1]
        x = x ** 2
        y = y ** 2
        dist.append((x + y) ** 0.5) #对距离进行排序,返回坐标
    index = argsort(dist) #求出前k个最近距离中,每个标签有多少个
    count = {}
    for i in range(K):
        tap = label[index[i]]
        count[tap] = count.get(tap, 0) + 1 #求出被标记最多次的标签
    flag = 0
    for tap in count.keys(): #再次排序
        if flag < count[tap]:
            flag = count[tap]
            result = tap
    return result

data, labelss = get_trainData()
input = [2.0,7.1]
haha = KNN(input, data, labelss, 4)
print (haha)

放上之前的代码,由于没有打注释,导致几天后的自己看回代码都有点懵逼了,吸取教训,以后一定要好好注释

你可能感兴趣的:(机器学习)