K-近邻算法 KNN
定义:如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)
的样本中的大多数属于某一个类别,则改样本也属于这个类别
计算距离:欧式距离
z = sqrt((x1-x2)^2 + (y1-y2)^2)
相似样本,特征之间的值应该都是相近的
需要做标准化处理
k的取值
k较小 容易受异常点影响
k较大 容易受k值数量波动
优点
简单,易于实现,无需估计参数,无需训练
缺点
懒惰算法,计算量较大,内存开销大
必须指定k值,k值选择不当则分类精度不能保证
使用场景
小数据场景,几千-几万
代码示例
# -*- coding: utf-8 -*- from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris import matplotlib.pyplot as plt # 查看数据集, 4个特征,分3类 iris = load_iris() print(iris.feature_names) print(iris.data[:5]) print(iris.target_names) print(iris.target[:5]) print(iris.DESCR) """ ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2]] ['setosa' 'versicolor' 'virginica'] [0 0 0 0 0] """ # 训练集测试集拆分 3-7开 X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.33, random_state=42) # K-近邻算法训练数据 knn = KNeighborsClassifier(n_neighbors=15) knn.fit(X_train, y_train) print(knn.score(X_test, y_test)) # 绘制n_neighbors取值与score的关系 x = [1, 2, 3, 5, 10, 15, 20, 30, 40, 50, 80, 100] y = [0.98, 0.98, 0.98, 0.98, 0.98, 1.0, 1.0, 1.0, 0.94, 0.92, 0.3, 0.3] plt.plot(x, y) plt.xlabel("n_neighbors") plt.ylabel("score") plt.savefig("n_neighbors", dpi=600)