统计学习方法学习笔记2——KNN

K 近邻算法:

  • 输入:训练数据集 T = {(x1,y1), (x2,y2),...,(xn,yn)}
      其中,xi为属于R的实例特征向量,yi是属于{c1,c2,...,ck}的实例类别实例特征向量为xi。
    
  • 输出:实例 x 所属的类 y。
  • 步骤:
    • 1.根据给定的距离度量,在训练集 T 中找出与 x 最近邻的 k 个点,涵盖这 k 个点的 x 的领域记作 Nk(x);
    • 2.在 Nk(x) 中根据分类决策规则(如多数表决)决定 x 的类别 y;

K 近邻算法的伪代码:对未知类别属性的数据集中的点进行如下的操作

  • 1.计算已知类别的数据集中的点与当前点之间的距离(欧几里得距离);
  • 2.按照距离递增次序排序;
  • 3.选取与当前点距离最小的 K 个点;
  • 4.确定前 K 个点所在类别的出现频率;
  • 5.返回前 K 个点出现频率最高的类别作为当前点的预测分类。

python实现KNN算法

# 自编程实现 KNN 算法
def knn_self(data, dataset, label, k):
    leth, _ = dataset.shape
    dist_key = {}
    for i in range(leth):
        tmp = np.sqrt(np.sum(np.square(data - dataset[i])))
        dist_key[str(tmp)] = label[i][0]
    dist_key = sorted(dist_key.items(),key=operator.itemgetter(0),reverse=False)    # 对距离进行排序
    rate = []
    print(dist_key)
    for j in range(k):
        distance, lab = dist_key[j]
        rate.append(lab)
    pre = {}
    for x in set(rate):
        p = rate.count(x)
        pre[str(x)] = p
    pre_x = sorted(pre.items(),key=operator.itemgetter(1),reverse=True)
    print(pre_x)
    prediction, rate = pre_x[0]
    return [prediction]

sklearn实现knn

def sk_knn(data_test, dataset, label, k):
    model_knn = KNeighborsClassifier(n_neighbors=k)
    model_knn.fit(dataset, label)
    predtion = model_knn.predict(data_test)
    return predtion

常用参数解释:

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, 
weights=’uniform’, 
algorithm=’auto’, 
leaf_size=30,p=2, 
metric=’minkowski’, 
metric_params=None, 
n_jobs=1, **kwargs)
  • n_neighbors:就是选取最近的点的个数:k
  • leaf_size:这个是构造树的大小,值一般选取默认值即可,太大会影响速度。
  • n_jobs :默认值1,选取-1占据CPU比重会减小,但运行速度也会变慢,所有的core都会运行。

dataset = np.array([[5, 4], [9, 6], [4, 7], [2, 3], [8, 1], [7, 2]])
label = np.array([[1], [1], [1], [-1], [-1], [-1]])
data = np.array([[5, 3]])
pre_self = knn_self(data, dataset, label, 4)
print('The pretion of self model is:', pre_self)
pre_sk = sk_knn(data, dataset, label, 4)
print('The pretion of sklearn model is:', pre_sk)
[('1.0', 1), ('2.23606797749979', -1), ('3.0', -1), ('3.605551275463989', -1), ('4.123105625617661', 1), ('5.0', 1)]
[('-1', 3), ('1', 1)]
The pretion of self model is: ['-1']
The pretion of sklearn model is: [-1]

注意:

1.KNN算法的结构复杂度主要体现与K值的选择:
     K值越小,模型就越复杂,从而容易产生过拟合;
     K值越大模型越简单,但是学习的近似误差也就越大。
2.KNN算法的不足:
     假如某些类的样本容量很大,而其他类的样本容量很小,即已知样本数量不均匀时,有可能当输入一个和样本容量小的同类型的数据时,该样本的K个邻居中大容量类的样本占多数,就会造成误分类;对此问题的解决办法是:加权平均于距离。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值