人工智能-算法学习
1. KNN聚类算法
a. knn定义
KNN 算法是一个基本的分类和回归的算法,它是属于监督学习中分类方法的一种。
b.knn原理
-
KNN 算法思想 给定一个训练集合 M 和一个测试对象 m ,其中该对象是由一个属性值和未知的类别标签组成的向量。 计算对象 m 和训练集中每个对象之间的距离(一般是欧式距离)或者相似度(一般是余弦相似度),确定最近邻的列表 将最近邻列表中数量占据最多的类别判给测试对象 z 。 一般来说,我们只选择训练样本中前 K 个最相似的数据,这便是 k-近邻算法中 k 的出处。
用一句俗语来总结 KNN 算法的思想:物以类聚,人以群分
根据图形判断:蓝色图形应该是属于三角形
? K=3 的情形
从图中可以看出来:蓝色部分还是属于三角形
? K=5 的情形
此时我们观察到蓝色部分属于正方形了
? K=7 的情形
这个时候蓝色部分又变成了三角形
当 K 取值不同的时候,判别的结果是不同的。所以该算法中K值如何选择将非常重要,因为它会影响到我们最终的结果。
c.knn应用实例(根据数据区分癌症性质)
需要用到csv 以及random
通过knn算法对癌症的分类可通过以下几个步骤实现:
-
创建数据集合和标签 -
利用欧式距离,使用 算法进行分类 a.计算欧式距离 b.距离的排序(从大到小) c.统计 K 个样本中出现次数多的,归属于该类别
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
test_set=datas[0:n]
train_set=datas[n:]
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=3
def knn(data):
res=[
{"result": train['diagnosis_result'], "distance": distance(data, train)}
for train in train_set
]
res=sorted(res, key=lambda item:item["distance"])
res2=res[0:K]
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)))
运行结果:
|