鱼找鱼阿虾找虾,KNN算法帮着乌龟找王八

初识KNN



KNN算法是《机器学习实践》这本书介绍的第一个分类算法,可见其地位非凡。虽然随着入行资历增长,可能会越来越看轻它,但这就是历练的必经之路,要想过此路,先得跨过它。


KNN(K-NearestNeighbor),邻近算法。说白了就是近朱者赤近墨者黑的分类思想,白的附近算白帮,黑的附近算黑派。你跟谁走的比较近,你们多半是一类人。这就是算法核心思想的通俗理解。


鱼找鱼虾找虾乌龟找王八,好的吧,算你赢。


就是用鱼找鱼,虾找虾的样本构建一个分类模型,模型建立好了后,输入乌龟,帮你找到自己的圈儿——王八。


KNN的工作原理专业解说:存在一个样本数据集合,也叫训练样本集,并且样本集合中每个数据都有自己的标签,即我们知道样本集中每一条记录与所属分类关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。


KNN实操



教科书的样板代码如下,帮你敲好了~

import operator

import numpy as np

import matplotlib.pyplot as pp

def createDataSet():

   # 数据集

   group = np.array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]])

   # 标签集

   labels = ['A','A','B','B']

   return group,labels

group,labels = createDataSet()

# k-近邻算法

def classify0(inX, dataSet, labels, k):

   dataSetSize = dataSet.shape[0]

   diffMat = tile(inX, (dataSetSize,1)) - dataSet

   sqDiffMat = diffMat ** 2

   sqDistances = sqDiffMat.sum(axis=1)

   distances = sqDistances ** 0.5

   sortedDistIndicies = distances.argsort()

   classCount = {}

   

   for i in range(k):

       voteIlabel = labels[sortedDistIndicies[i]]

       classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

       

   sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

   return sortedClassCount[0][0]

classify0([0,0], group, labels, 3)

我也根据自己输入样本的数据结构,改写一下算法~

import operator

import pandas as pd

import numpy as np

LearnSample = pd.read_excel('LearnSample.xlsx')

def KNNClassify(LearnSample, InX, k):

   DistResult = pd.DataFrame({}, index=[0])

   count = 0

   for index, value in LearnSample['category'].items():

       diff = (np.array(LearnSample.loc[index,['x1','x2']]) - np.array(InX)) ** 2

       dist = diff.sum(axis = 0) ** 0.5

       new = pd.DataFrame({'distance': dist, 'category':value}, index=[count])

       count += 1

       DistResult = DistResult.append(new, ignore_index=True)

       DistResult = DistResult.sort_values('distance', ascending=True).head(k)

       category = DistResult['category'].value_counts().index[0]

   return category

KNNClassify(LearnSample=LearnSample,InX=[0,0], k=3)

顺利帮着乌龟找到王八


输入样本的一部分是这样:

待分类的数据长这样:

对每一个待分类的记录,调用KNN算法函数,结果写入到Dataframe中,完成。

for index, value in result['x1'].items():

   result['拟分类'][index] = KNNClassify(LearnSample, [value,result['x2'][index]], 3)

result.head()

结果如下所示:


优缺点分析


优点

1.易于理解、实现,无需估计参数,无需训练;

2.适合多分类问题,KNN比SVM表现要好。


缺点

1.计算量大,每一个待分类的记录都要计算其与每个已知的样本的距离

2.受到学习样本中每个分类的样本容量影响较大。


欢迎长按下方图片,识别途中二维码,关注“数据分析师手记”~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值