K近邻算法

2019-03-20  本文已影响0人  伏牛山忍者

算法原理

首先k紧邻算法是分类算法, 用来判断是属于哪一类别的。
给若干个有标记的样本, 例如下图:


图1.jpg

然后给一个未标记测试样本,通过计算测试样本距离所有样本的距离, 拿出 最小的K 个样本, 判断K个样本中哪个类别最多,就是判定该测试样本属于该类别。


2.jpg

优点:算法简单,精度较高,对异常值不敏感, 无数据输入假定
缺点:对每个数据集的每个数据特征都要计算距离值,计算复杂度高, 空间复杂度高, 所以一般使用小数据集

算法封装 (python)

# -*-coding:utf-8-*-
import numpy as np
import matplotlib.pyplot as plt


def load_data():
    data = np.array([
        [0.1, 0.1, -1],
        [0.2, 0.1, -1],
        [0.3, 0.2, -1],
        [0.2, 0.4, -1],
        [0.3, 0.4, -1],
        [1.3, 1.0, 1],
        [1.2, 0.9, 1],
        [1.1, 1.4, 1],
        [1.3, 1.6, 1],
        [1.5, 1.4, 1],
    ])
    return data


def classify(data, test, k=3):
    """
    K紧邻判别方法
    :param data:
    :param test:
    :param k:
    :return:
    """
    distance = np.sum(np.square(data[:, :-1] - test), axis=1)
    k_orders = np.argsort(distance)[:k]
    result = np.sum(data[k_orders, -1])
    if result > 0:
        return 1
    else:
        return -1


data = load_data()
test = [0.8, 0.5]
rel = classify(data, test, k=5)
print(rel)

# 可视化
negative = data[data[:, -1] == -1][:-1]
positive = data[data[:, -1] == 1][:-1]
plt.scatter(negative[:, 0], negative[:, 1])
plt.scatter(positive[:, 0], positive[:, 1])
plt.scatter(test[0], test[1])
plt.show()

上一篇下一篇

猜你喜欢

热点阅读