KNN算法

KNN算法通过计算预测数据与训练数据集合距离,通过k值判定,获取距离最近的k个值对应的target,通过target数量最大预测数据。其中距离采用公式为:欧式距离。

import numpy as np
#knn公式,距离为欧式距离 
def knn(inX,dataset,target,k):
    #inX:预测数据 
    #dataset/target:样本数据  类型numpy
    #k:knn算法选取的数据量
    numDataSet = dataset.shape[0]
    diffMat = np.tile(inX,[numDataSet,1]) - dataset
    sqDiffMat = diffMat ** 2
    sqDiffMatSum = np.sum(sqDiffMat,axis=1)
    distance = sqDiffMatSum ** 0.5 
    sortedDistance = distance.argsort() 
    
    labelCounts = {} 
    for i in range(k):
        voteLabel = target[sortedDistance[i]]
        labelCounts[voteLabel] = labelCounts.get(voteLabel,0) + 1 
    prediction = sorted(labelCounts.items(),key=lambda x:x[1],reverse=true)
    return prediction[0][0]
#数据归一化
def autoNum(dataset):
    min_value = np.min(dataset,axis=0)#返回dataset所有列的每一列最小值
    max_value = np.max(dataset,axis=0)
    numDataSet = dataset.shape[0]
    ranges = max_value - min_value 
    normData = (dataset - np.tile(min_value,[numDataSet,1]))/ranges
    #返回归一化数据,大小数据差,最小值,其中大小数据差、最小值用于测试数据归一化
    return normData,ranges,min_value

方法2:直接调用sklearn已有的算法实现

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5,weights='uniform',algorithm='auto',leaf_size=30,
p=2,metric='minkowski',metric_params=None,n_jobs=None,**kwargs)
#参数定义
"""
1.n_neighbors:KNN中的k值,默认值为5
2.weights:用于标识每个样本的近邻样本的权重,可选择"uniform","distance"或自定义权重。默认"uniform",所有最近邻样本权重都一样。如果是"distance",则权重和距离成反比例;如果样本的分布是比较成簇的,即各类样本都在相对分开的簇中时,默认的uniform就可以了,如果样本的分布比较乱,规律不好寻找,选择"distance"是最好的选择。
3.algorithm:限定半径最近邻法使用的算法,可选:"auto","ball_tree","kd_tree","brute"
4.leaf_size:使用kd_tree树或者ball_tree时,控制子树叶子节点的阈值
5.metric:度量,默认闵可夫斯基距离(p=1:曼哈顿距离:直线距离;p=2:欧式距离)
  闵可夫斯基距离:np.sum(np.abs(x-y)^p)^(1/p);明显p=2时为欧式距离
"""
knn.fit(x,y)
prediction = knn.predict(x_test)
return prediction

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值