KNN(k近邻算法)实例之医用判断良性恶性肿瘤
本文数据为真实数据,但是数据量少,不能作为科学用途,数据来源数据集上kaggle,点击dataset,搜prostate cancer,第二个就是,本文所用数据为100条,文章最后有本文所使用数据,如果需要自行提取,另附笔者学习的视频
目录
- 题目
- 完整代码
- 详解代码
- 导入文件
- 对数据进行分类
- 求距离函数
- KNN函数
- 正确率判断
- 代码改进
- 所用文件
- 教学视频
题目
医学上判断肿瘤需要通过"radius",“texture”,“perimeter”,“area”,“smoothness”,“symmetry”
,“compactness”,"fractal_dimension"等数据来判断肿瘤是否为恶性,现在有一组数据,请用knn方法来进行分析肿瘤的良性恶性(良性肿瘤用“B”,恶性肿瘤用“M”表示)
部分数据样例如图所示:
如图所示,id为序号,diagnosis_result为肿瘤判断结果,也是我们所需要求出的,剩余量为条件变量(分类依据)
完整代码
#导入文件
import csv
import randomwith open(r'F:\prostate-cancer(1)\Prostate_Cancer.csv') as file:reader = csv.DictReader(file)data = [row for row in reader]n = len(data)//3
test_data = data[0: n]
train_data = data[n: ]#求距离
def distance(d1, d2):res = 0for key in ("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):res += (float(d1[key]) - float(d2[key])) ** 2return res**0.5#knn算法
#定义K值
k = 5
def knn(data):#1.求距离res = [{"result": train["diagnosis_result"], "distance": distance(data, train)}for train in train_data]#2.排序res=sorted(res, key=lambda item: item['distance'])res2 = res[0: k]#判断类别reslut = {"M":0,"B":0}for key in res2:if key['result'] == "M":reslut["M"] += 1else:reslut["B"] += 1if reslut["M"]>reslut['B']:# print("M")return "M"else:# print("B")return "B"
#----------------------------------------------------------------------#
#正确率判断
sum = 0
m = 0
for data in test_data:sum += 1if knn(data) == data["diagnosis_result"]:m += 1
last = m/sum
print(last)
详解代码
导入文件
这个文件的格式是.csv,我们可以将它直接转化为字典模式`
#导入文件
import csvwith open(r'F:\prostate-cancer(1)\Prostate_Cancer.csv') as file:reader = csv.DictReader(file)#转化为字典data = [row for row in reader]#使得每一个字典数据为列表中的元素
对数据进行分类
对这100条数据分类,由于数据不多,我们按照1/3为测试数据,2/3为训练数据的方式分类(如果数据有很多,我们可以采用1/10为测试数据)
n = len(data)//3 #在这里我们采取了整除
test_data = data[0: n]
train_data = data[n: ]
求距离函数
这是knn算法的重要步骤之一,python有很多种距离,本文采用的是最常见的欧式距离,即 √(x1-x2)²+(y1-y2)²…,随着条件簇的增多,我们写的参数越多
#求距离
def distance(d1, d2):res = 0for key in ("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):res += (float(d1[key]) - float(d2[key])) ** 2return res**0.5
函数传入两个参数后,我们定义一个元组,定义一个变量key依次遍历,元组中的值,而传入的d1和d2都是我们列表中的字典,这样我们可以求得字典所对应键值的value值,同时我们又发现value值为字符串模式,且存在大量小数,采用转型变成float型进行运算,并返回开方值
KNN函数
先随机设定k值(但是要合理)
k = 5
knn函数
def knn(data):#1.求距离res = [{"result": train["diagnosis_result"], "distance": distance(data, train)}for train in train_data]#2.排序res=sorted(res, key=lambda item: item['distance'])res2 = res[0: k]#判断类别reslut = {"M":0,"B":0}for key in res2:if key['result'] == "M":reslut["M"] += 1else:reslut["B"] += 1if reslut["M"]>reslut['B']:# print("M")return "M"else:# print("B")return "B"
在knn函数中,我们先定义一个输出列表,列表内容为一系列字典,字典的一个key-value值为所使用的训练数据的肿瘤良恶性结果;一个key-value值为距离判断,用来执行距离函数,并依次为依据排序,这个列表的输出结果为每一次所调用的训练数据肿瘤良恶性判断和输入的测试数据与所调用的训练数据各个判断簇的距离
随后对列表按照距离升序排序,取前k个
并进行数据统计,数据次数多的为该测试数据在knn算法后的良恶性情况输出结果
正确率判断
将所有的测试数据进行测试判断,并将knn函数的返回值和测试数据原来的结果进行比较,得到正确率,修改k值,得到最佳解
#正确率判断
sum = 0
m = 0
for data in test_data:sum += 1if knn(data) == data["diagnosis_result"]:m += 1
last = m/sum
print(last)
代码改进
该代码有改进之处:
1.由于数据少,存在偶然情况,所以我们可以把每行数据看成整体并对数据进行随机排列,使得训练组和测数组的数据多样化,减少偶然误差
2.对于测试数据和训练数据之间的距离,应该添加权重,即距离近的权重大,距离远的权重小,从而减少误差
改进后的代码
import csv
import randomwith open(r'F:\prostate-cancer(1)\Prostate_Cancer.csv') as file:reader = csv.DictReader(file)datas = [row for row in reader]#对数据进行随机排序
random.shuffle(datas)n = len(datas)//3
test_set = datas[0:n]
train_set = datas[n:]def distance(d1,d2):res = 0for key in ("radius","texture","perimeter","area","smoothness","compactness","symmetry","fractal_dimension"):res += (float(d1[key])-float(d2[key]))**2return res**0.5 k = 6def knn(data):res = [{"result":train["diagnosis_result"],"distance":distance(data,train)}for train in train_set]res = sorted(res,key = lambda item:item['distance'])#取前K个值res2 = res[0:k]#加权平均(result是最终判据)result = {'B':0,'M':0}#总长度sum_dist = 0for r1 in res2:sum_dist += r1['distance']#逐个分类加和for r2 in res2:result[r2["result"]] += 1-r2["distance"]/sum_dist#print(result)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 = correct + 1;print("正确率为:" + str(correct/len(test_set)))
所用文件
链接:https://pan.baidu.com/s/1JAWOu2mO_GSfwTu_6Z5YVg
提取码:3zhs
复制这段内容后打开百度网盘手机App,操作更方便哦
教学视频
b站教学
KNN(k近邻算法)实例之医用判断良性恶性肿瘤相关推荐
- knn K近邻算法python实现
本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...
- 【20210922】【机器/深度学习】KNN (K近邻) 算法详解
一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...
- KNN K近邻算法学习
KNN算法.k-nearest neighbor,或者K-近邻算法是一种经典的机器学习算法,可以完成分类和回归任务. KNN算法主要思想: 对于输入的特征X,选取与他记录最近的K个点,统计这K个点所属 ...
- knn(k近邻算法)——matlab
目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 读取数据 4.2 分离训练集和测试集 4.3 归一化处理 4.4 ...
- k近邻算法(KNN)-分类算法
k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. k-近邻算法采用测量不同特征值之间的 ...
- K近邻算法KNN的简述
什么是KNN K近邻算法又称KNN,全称是K-Nearest Neighbors算法,它是数据挖掘和机器学习中常用的学习算法,也是机器学习中最简单的分类算法之一.KNN的使用范围很广泛,在样本量足够大 ...
- 01 K近邻算法 KNN
01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...
- 【模式识别】实验二:K近邻算法(KNN)
KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...
- 机器学习算法基础——k近邻算法
23.k-近邻算法以及案例预测入住位置 24.K-近邻算法案例 分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本 ...
最新文章
- 激活手表显示无法登陆服务器,在Firefox中使用Nightwatch运行测试无法连接到Selenium服务器...
- JAVA正則表達式小总结
- python零碎知识(5):有关正则表达式
- 与容器服务 ACK 发行版的深度对话第二弹:如何借助 hybridnet 构建混合云统一网络平面
- JMeter环境搭建
- 精通CSS+DIV网页样式与布局——CSS文字效果
- registerModulePath
- Linux C 串口属性设置
- Java并发执行器的懒惰开发人员简介
- 全国计算机二级C 错题/知识点整理
- python是什么意思-python中class是什么意思
- C++核心准则边译边学-不必惊慌!
- 2021年茶艺师(初级)考试题及茶艺师(初级)最新解析
- 无线蓝牙耳机哪个品牌好?蓝牙降噪耳机品牌推荐
- 不允许使用不完整的类型_孩子,我允许你不优秀,但我不允许你不努力!
- 国内安装oh-my-zsh
- picoCTF,Reverse Engineering,逆向类,42/55
- perl中bless的理解(zz) z
- python 限定数据范围_Python 生成周期性波动的数据 可指定数值范围2
- 【软件构造】实验一的心得体会