1 什么是knn算法
首先要认识knn算法,什么是knn算法?简单一句话就是寻找最近的k个数据,来推测新数据的分类,确定新数据的大概类型。简而言之,就可以理解为“看一个人怎么样,看看他身边的朋友什么样就知道了”,有点人以类聚,物以群分的意思,以总体情况推测某一个个体怎么样。多应用于数据分析,如医院的某检测系统,初步判断是否确诊。下面将会给出一个简单的医院示例。
2 算法原理
* 通用步骤
1计算距离(常用欧几里得距离或马氏距离)
2升序排列
3取前k个
4 加权平均
*K的选取(核心)
1 k太大:导致分类模糊
2 k太小:受个例影响,波动较大
K取值大致有两种通用方法:
1 靠经验,比如经常处理相关问题,知晓什么值合适
2 不断试,比如第一遍取8,准确性达到了70%,则说明可以,然后换一个6,准确性下降了,则需要取靠近8的数
*如何选取k
1 经验(上面说过)
2 均方根误差
比如概率统计中的峰值高的部分
3 实战应用
从数据表中分析(由于实验部分,所以数据集较小)
以上是癌症检测数据 M,B则说明是否有病,比如True和False,其他的都是一些化验数据
数据集链接:https://pan.baidu.com/s/1w8cyvknAazrAYnAXdvtozw
提取码:zxmt
import csv
import random
#读取
with open("Prostate_Cancer.csv","r") as file:#读入文件并写入
reader = csv.DictReader(file)#以字典形式读取
datas = [row for row in reader]#推导
#分组
random.shuffle(datas)#打乱数据
n = len(datas)//3#整除
#2/3训练集
train_set = datas[n:]
#1/3测试集
test_set = datas[0:n]
# print(test_set)
#KNN
#距离
def distance(d1,d2):
res=0
for key in ("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):
res+=(float(d1[key])-float(d2[key]))**2
return res**0.5
K=5
def knn(data):
#1.距离
res=[
{"result":train['diagnosis_result'],"distance":distance(data,train)}
for train in train_set
]
#2.排序--升序
res=sorted(res,key=lambda item:item['distance'])
#3.取前K个
res2=res[0:K]
#4.加权平均
result={'B':0,'M':0}
#总距离
sum=0
for r in res2:
sum+=r['distance']
for r in res2:
result[r['result']]+=1-r['distance']/sum
if result['B']>result['M']:
return 'B'
else:
return 'M'
#测试阶段
correct=0
for test in test_set:
result=test['diagnosis_result']
result2=knn(test)
if result==result2:
correct+=1
print("准确率:{:.2f}%".format(100*correct/len(test_set)))
得到结果
说明准确性达到78%,有一些误差,数据不够,训练集少了,但是78%的准确性已经可以反映出大致情况了,当然具体检测结果还得医院仪器检测,此数据只能起统计意义,可以用在炒股方面。
4 knn k近邻算法原理
由于小编在家没事做,所以在网上查看了诸多内容后对这个k值的选择又有了更深理解。
k近邻算法:简单地说,k近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。
k-近邻算法(kNN),它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
具体代码展示小编还没有实现,后续有机会会继续更新,喜欢就关注一下吧!