KNN学习

一、原理

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)

运行结果如下:



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