一. 算法介绍
KNN算法中文名称叫做K近邻算法,是众多机器学习算法里面最基础入门的算法。它是一个有监督的机器学习算法,既可以用来做分类任务也可以用来做回归任务。KNN算法的核心思想是未标记的样本的类别,由距离他最近的K个邻居投票来决定。
二. 算法流程
通过理解算法思想,可以将其简化为“找邻居+投票”。K近邻法使用的模型,实际上是特征空间的划分。模型由三个基本要素决定:
- 距离度量
- k值
- 分类决策规则
其中两个实例点之间的距离反映了相似程度。一般来说使用欧氏距离来计算。
梳理kNN算法流程
- 计算测试对象到训练集中每个对象的距离
- 将训练集样本数据按照距离升序排序
- 选取与当前测试对象最近的k的训练对象,作为该测试对象的邻居
- 统计这k个邻居的类别频率
- k个邻居里频率最高的类别,即为测试对象的类别
三. 分类算法样例
首先我们有组已知的训练数据:其中横轴是肿块大小,纵轴是发现时间。每个病人的肿块大小和发病时间构成了二维平面特征中的一个点。对于每个点,明确是恶性肿瘤、良性肿瘤。现在有一个病例X的肿块大小和发现时间,需要分类该病例是否恶性肿瘤
代码实现
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
from sklearn.metrics import accuracy_score
# 读取数据 X, y
raw_data_X = [[3.393533211, 2.331273381],
[3.110073483, 1.781539638],
[1.343853454, 3.368312451],
[3.582294121, 4.679917921],
[2.280362211, 2.866990212],
[7.423436752, 4.685324231],
[5.745231231, 3.532131321],
[9.172112222, 2.511113104],
[7.927841231, 3.421455345],
[7.939831414, 0.791631213]
]
#0为恶性,1为良性
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
# 设置训练组
X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)
# 把数据分成训练数据和测试数据
raw_test_x = [[8.90933607318,3.365731514] ]
raw_test_y = [0]
X_test = np.array(raw_test_x)
y_test = np.array(raw_test_y)
# 构建KNN模型, K值为3、 并做训练
clf = KNeighborsClassifier(n_neighbors=6)
clf.fit(X_train, y_train)
print("预测值:%.3f" % (np.count_nonzero(clf.predict(X_test))))
# 计算准确率
correct = np.count_nonzero((clf.predict(X_test) == y_test) == True)
accuracy_score(y_test, clf.predict(X_test))
print("准确率(Accuracy) is: %.3f" % (correct / len(X_test)))