一、原理
k-近邻算法(k-Nearest Neighbour algorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。KNN
的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻
近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最
近的k个点来投票决定X归为哪一类。
二、代码实现
#####导入数据
import pandas as pd
from numpy import *
rowdata = {'N':['a1','a2','a3','d1','d2','d3'], #样本名称
'D':[1,5,12,108,112,115], #特征一
'A':[101,89,97,5,9,8], #特征二
'C':['AM','AM','AM','DM','DM','DM']} #标签值
m_data = pd.DataFrame(rowdata)
##########计算欧氏距离
def knn(inx,dataSet,k):
result =[]
dist =list((((dataSet.iloc[:,1:3]-inx)**2).sum(1))**0.5)
dist_l =pd.DataFrame({'dist':dist,'lables':(dataSet.iloc[:,3])})
dr= dist_l.sort_values(by ='dist') [: k]
re= dr.loc[:,'lables'].value_counts()
result.append(re.index[0])
return result
######输入需要预测的数据
new_data=[106,33]
inx = new_data
dataSet =m_data
k=3
print(knn(inx,dataSet,k))
##运行结果
三、k-近邻算法之约会网站配对效果判定
数据类型如图所示:
可以看到数据又3个特征以及一个标签,标签分为了3类。
但是可以看到的是,数据之间差距太大,第0列的数据和其他两列差距很大,所以为了避免数据差值过大造成影响,对数据进行归一化处理。
归一化处理公式:
经过这样处理后,数据便全部处于0-1之间了。
归一化代码实现如下:
def minmax(dataSet):
minDf = dataSet.min()
maxDf = dataSet.max()
normSet = (dataSet - minDf )/(maxDf - minDf)
return normSet
下面划分数据集,这里我们用了最简单的直接划分,百分之七十用来训练,剩下的用来测试
代码实现 如下
def randSplit(dataSet,rate=0.7):
n = dataSet.shape[0]
m = int(n*rate)
train = dataSet.iloc[:m,:]
test = dataSet.iloc[m:,:]
test.index = range(test.shape[0])
return train,test
train,test = randSplit(datingT)
最后,用构建好的分类器分类
def datingClass(train,test,k):
n = train.shape[1] - 1
m = test.shape[0]
result = []
for i in range(m):
dist = list((((train.iloc[:, :n] - test.iloc[i, :n]) ** 2).sum(1))**0.5)
dist_l = pd.DataFrame({'dist': dist, 'labels': (train.iloc[:, n])})
dr = dist_l.sort_values(by = 'dist')[: k]
re = dr.loc[:, 'labels'].value_counts()
result.append(re.index[0])
result = pd.Series(result)
test['predict'] = result
acc = (test.iloc[:,-1]==test.iloc[:,-2]).mean()
print(f'模型预测准确率为{acc}')
return test
datingClass(train,test,5)
运行结果如下: