肿瘤细胞的良性/恶性判断
- 横轴为肿瘤大小
- 纵轴是发现时间
- 红色为良性,蓝色的为恶性
此时新来了新病人(绿色的点),判断该绿色点为良性还是恶性
专家根据以往经验,确定K值为3,获取到与绿色的点最近的三个点,这三个点进行“投票”,确定绿色的点为良性还是恶性
与绿色点临近的3个点都是恶性,那么新的绿色的点,很高的概率为恶性。
欧拉距离
上面的如果需要通过算法实现,首先要解决计算两点距离问题。
二维平面两点距离公式
三维立体空间距离公式
对应的n维空间距离公式
简写为:
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]
- x 为需要进行评估的点
- k 为指定的与x最近的k个点
- X_train为坐标点,训练集
- Y_train与X每个坐标点一一对应的结果集
机器学习的原理 将训练数据集投递给机器学习算法,算法去修正机器学习模型,有输入样例时,直接通过模型获取输出结果
KNN算法特点
- 不需要训练模型,直接通过算法即可得到输入样例的输出结果
- 为了和其他机器学习算法,我们可以称为训练数据集本身就是训练模型
使用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]