Python机器学习(3)-K近邻算法

81 阅读1分钟

肿瘤细胞的良性/恶性判断

image.png

  1. 横轴为肿瘤大小
  2. 纵轴是发现时间
  3. 红色为良性,蓝色的为恶性

此时新来了新病人(绿色的点),判断该绿色点为良性还是恶性 image.png

专家根据以往经验,确定K值为3,获取到与绿色的点最近的三个点,这三个点进行“投票”,确定绿色的点为良性还是恶性

image.png

与绿色点临近的3个点都是恶性,那么新的绿色的点,很高的概率为恶性。

image.png

欧拉距离

上面的如果需要通过算法实现,首先要解决计算两点距离问题。

二维平面两点距离公式

image.png

三维立体空间距离公式

image.png

对应的n维空间距离公式

image.png

简写为:

image.png

py实现

from collections import Counter
from math import sqrt
import numpy as np


def knn_classify(k, X_train, Y_train, x):
    assert 1 <= k <= X_train.shape[0], "k must be valid"
    assert X_train.shape[0] == Y_train.shape[0], "x_train.shape[0] must equals y_train.shape[0]"
    assert X_train.shape[1] == x.shape[0], "x_train.shape[1] must equals x.shape[0]"

    distances = [sqrt(np.sum((X_train - x) ** 2)) for x_train in X_train]
    nearest = np.argsort(distances)

    topK_y = [Y_train[i] for i in nearest[:k]]
    votes = Counter(topK_y)

    return votes.most_common(1)[0][0]
  1. x 为需要进行评估的点
  2. k 为指定的与x最近的k个点
  3. X_train为坐标点,训练集
  4. Y_train与X每个坐标点一一对应的结果集

image.png 机器学习的原理 将训练数据集投递给机器学习算法,算法去修正机器学习模型,有输入样例时,直接通过模型获取输出结果

KNN算法特点

  1. 不需要训练模型,直接通过算法即可得到输入样例的输出结果
  2. 为了和其他机器学习算法,我们可以称为训练数据集本身就是训练模型

使用skikit-learn调用KNN算法

from sklearn.neighbors import KNeighborsClassifier
import numpy as np

raw_x = [
    [3.393533211, 2.3312733811],
    [3.110073483, 1.7815396381],
    [1.343808831, 3.3683609541],
    [3.582294042, 4.679179110],
    [2.280362439, 2.8669902631],
    [7.423436942, 4.696522875],
    [15.745051997, 3.5339898031],
    [9.172168622, 2.511101045],
    [7.792783481, 3.4240889411],
    [7.939820817, 0.791637231]
]
raw_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
X_train = np.array(raw_x)
Y_train = np.array(raw_y)
predict_x = np.array([8.093607318, 3.365731514]).reshape(1, -1)

if __name__ == '__main__':
    KNN_classifier = KNeighborsClassifier(n_neighbors=5)
    KNN_classifier.fit(X_train, Y_train)
    rsp = KNN_classifier.predict(predict_x)
    print(rsp)
    # out: [1]