主要内容:
1.认识kNN算法
2.kNN算法原理
3.应用举例
4.kNN改进方法
1.认识knn算法
“看一个人怎么样,看他身边的朋友什么样就知道了”,kNN算法即寻找最近的K个数据,推测新数据的分类。
kNN算法可以说是最简单的分类算法之一,也是最常用的分类算法之一。
特点
kNN是一种非参的,惰性的算法模型。
非参即这个模型不会对数据做出任何的假设,与之相对的是线性回归(总假设线性回归是一条直线)。也就是说kNN建立的模型结构是根据数据来决定的,比较符合现实的情况。
惰性即kNN算法不需要对数据进行大量训练,没有明确的训练数据过程,或者说这个过程很快。同样是分类算法,逻辑回归要先对数据进行大量训练,最后才会得到一个算法模型。
较其他算法更为适合:① 计算复杂性高,空间复杂性高;②样本不平衡的时候,对稀有类别的预测准确率低;③ 可解释性差,无法给出决策树那样的规则。
kNN优点
(1).简单易用,相比其他算法,比较简洁明了,即使没有很高的数学基础也能搞清楚原理
(2).模型训练时间快(上面说到KNN算法是惰性的,这里也就不再过多讲述)
(3).预测效果好
(4).对异常值不敏感
kNN缺点
(1).对内存要求较高,因为该算法存储了所有训练数据
(2).预测阶段可能很慢
(3).对不相关的功能和数据规模敏感
2.kNN算法原理
给定一个训练数据集,对新的的输入实例,在训练数据集中找到与该实例最邻近的的K个实例,这K个实例的多数属于某个类,就把该实例分为这个类。
K值选择、距离度量、分类决策(一般多数表决)为k近邻算法的三个基本要素。
(1).通用步骤
计算距离(常用欧几里得距离或马氏距离)
升序排列
取前K个
加权平均
(2).距离度量
(3).K的选取
K太大:导致分类模糊
K太小:受个例影响,波动较大
如何选取K:经验、均方根误差
3.应用举例(癌症检测)
数据集来源:
链接:https://pan.baidu.com/s/10GrGydkzfTmlmPmxURdWqg
提取码:19qe
代码:
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:]
'''
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 # 转换不能用int,因为数据有小数,用float;最后“**”求平方
return res**0.5 # 开方
K = 5
def knn(data):
# 1.距离
res = [
{"result": train['diagnosis_result'], "distance": distance(data, train)}
for train in train_set
]
# print(res)
# 2.排序——升序
res = sorted(res, key=lambda item: item['distance'])
# print(res)
# 3.取前K个
res2 = res[0:K]
# print(res2)
# 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:
result1 = test['diagnosis_result']
result2 = knn(test)
if result1 == result2:
correct += 1
print("准确率:{:.2f}%".format(100*correct/len(test_set)))
运行结果:
4.kNN改进方法
(1).不同的K值加权;
(2).距离度量据实际问题,使用不同距离;
(3).特征归一化;
(4).维数过大,PCA降维处理。