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