一、什么是KNN算法
k个最近邻居,原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。
比如该图,绿色是预测的点,若K=3,KNN算法就会找到与它距离最近的三个点,看是哪个类别比较多,绿色的点就归为哪个类别。K不一样,判定就不一样。
二、KNN实现步骤
1、计算距离(欧几里得距离或马氏距离)
2、升序排列
3、取前K个
K过大,分类模糊
K太小,受个例影响,波动大
4、加权平均
三、实例
读取数据
# 读取数据
with open(".\Prostate_Cancer.csv", "r") as f:
render = csv.DictReader(f)
datas = [row for row in render]
分组然后打乱数据
# 分组,打乱数据
random.shuffle(datas)
n = len(datas) // 3
test_data = datas[0:n]
train_data = datas[n:]
计算距离
# 计算对应的距离
def distance(x, y):
res = 0
for k in ("radius", "texture", "perimeter", "area", "smoothness", "compactness", "symmetry", "fractal_dimension"):
res += (float(x[k]) - float(y[k])) ** 2
return res ** 0.5
处理完数据后使用KNN算法
# 1. 计算距离
res = [
{"result": train["diagnosis_result"], "distance": distance(data, train)}
for train in train_data
]
# 2. 排序
sorted(res, key=lambda x: x["distance"])
# print(res)
# 3. 取前K个
res2 = res[0:K]
# 4. 加权平均
result = {"B": 0, "M": 0}
# 4.1 总距离
sum = 0
for r in res2:
sum += r["distance"]
# 4.2 计算权重
for r in res2:
result[r['result']] += 1 - r["distance"] / sum
# 4.3 得出结果
if result['B'] > result['M']:
return "B"
else:
return "M"
计算准确率
# 预测结果和真实结果对比,计算准确率
for k in range(1, 11):
correct = 0
for test in test_data:
result = test["diagnosis_result"]
result2 = knn(test, k)
if result == result2:
correct += 1
print("k=" + str(k) + "时,准确率{:.2f}%".format(100 * correct / len(test_data)))