原理
- 在训练集中寻找与该样本距离最近的 K
个样本,以其多数分类作为该样本的类别
- 使用欧氏距离计算两者间距离
- 也可采用其他距离公式
如明可夫斯基距离或者曼哈顿距离
- 超参数k:
- K值过小:容易受到异常数据影响
- K值过大:受样本不均衡影响
sklearn中的API
sklearn. neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
- n_neighbors:
int,可选(默认=5),k_neighbors查询默认使用的邻居数
- algorithm: {'auto','ball_tree',kd_tree','brute'},
可选用于计算最近邻居的算法:
- ‘ball_tree'将会使用 BallTree
- ‘kd_tree'将使用 KDTree
- 'auto'将尝试根
据传递给fit方法的值来决定最合适的算法。(不同实现方式影响效率)
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier def knn_iris(): """ 用KNN算法对鸢尾花进行分类 :return: """ iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test)
estimator = KNeighborsClassifier(n_neighbors=3) estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test) print("y_predict:\n", y_predict) print("直接比对真实值和预测值:\n", y_test == y_predict)
score = estimator.score(x_test, y_test) print("准确率为:\n", score) return None
|