KNN 算法实例

参考 :https://www.bilibili.com/video/BV1Nt411i7oD?from=search&seid=4603953531395093043

KNN算法:给定一个训练数据集,对新的的输入实例,在训练数据集中找到与该实例最邻近的的K个实例,这K个实例的多数属于某个类,就把该实例分为这个类。

下面是代码实例

import csv
import random

with open('Prostate_Cancer.csv', 'r') as file:  # 读取CSV文件
    reader = csv.DictReader(file)

    data = [row for row in reader]  # 数组每一块单独的元素代表一个样本的全部特征

random.shuffle(data)  # 打乱数据集

n = len(data)//3
test_set = data[0:n]
train_set = data[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  # 得到两个数据点之间的距离


def knn(data, K):
    res = [
        {"result:": train['diagnosis_result'], "distance": distance(data, train)}
        for train in train_set
    ]

    # 排序后去取knn参数k的前k个
    res = sorted(res, key=lambda res: res["distance"])  # 进行排序
    res2 = res[0:K]  # 取前几个的值
    result = {'B': 0, 'M': 0}
    sum = 0
    for r in res2:
        sum += r['distance']  # 将排序取得的前五个值和求出来
    """
    上面求得距离最近的K个点的距离,然后求和,
    后面是实现对是B还是M类的两类分别求的对应的离哪一个类的距离比较近一点
    """
    for r in res2:
        result[r['result:']] += 1 - r['distance']/sum
        """
        距离越大,说明距离目标类的距离越大,所占的权重应该也越大,
        利用前面1减去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, K=5)

    if result == result2:
        correct += 1

print('准确率', correct/len(test_set))

最终对每一个单独的输入得出最后的结果都需要扫一整遍训练数据集(对比数据集?),对于训练集大的那可能会导致结果出的很慢。

还有计算距离标准好像要求也不高,对于距离的量化标准方法好像也很多,但最终都是排序后取前K个数据距离最近的那些数据进行一定的量化所得出的分类结果。

你可能感兴趣的:(算法,机器学习,深度学习)