什么是K-近邻算法
  1. K-近邻算法(KNN)的原理
          K Nearest Neighbor算法有叫KNN算法。这个算法是机器学习里面一个比较经典的算法,总体来说KNN是相对比较容易理解的算法。
  • 定义
          如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
  • KNN的核心思想是:根据你的“邻居“推断出你的类别。
  • 距离公式
    两个样本的距离可以通过如下公式计算。
    (1)欧式距离:
    例如:a(a1,a2,a3),b(b1,b2,b3)
    KNN 距离度量方法_机器学习
    (2)曼哈顿距离
    KNN 距离度量方法_sklearn_02
    (3)名科夫斯基距离(欧式距离和曼哈顿距离是名科夫斯基距离的一个推广)
电影类型分析

假设现在有几部电影:

电影名称

打斗镜头

接吻镜头

电影类型

Cailfornia Man

3

104

爱情片

He’s not Realy into dues

2

100

爱情片

Bautiful Woman

1

81

爱情片

Kevin Longblade

101

10

打斗片

Robo Slayer 3000

99

5

打斗片

Amped lI

98

2

打斗片


18

90

未知

其中?电影不知道类别,如何去预测?可以使用KNN算法的思想:

电影名称

与未知电影的距离

Cailfornia Man

20.5

He’s not Realy into dues

18.7

Bautiful Woman

19.2

Kevin Longblade

115.3

Robo Slayer 3000

117.4

Amped lI

118.9

K-近邻算法API

sklearn.neighbors.KNeighborslassifier(n_neighbors=5,algorithm='auto')

  • n neighbors: int,可选(默认=5) , k_neighbors查询默认使用的邻居
  • algorithm: {‘auto’, ‘ball_tee’, ‘kd_tee’, ‘brute’}, 可选用于计算最近邻居的
    算法: 'ball tree’将会使用BallTree, "kd tree将使用KDTree. 'auto’将尝试根据传递给ft方法的值来决定最合适的算法。(不同实现方式影响效率)
案例1:鸢尾花种类预测
  1. 数据集介绍
          Iris数据集是常用的分类数据集,是一种多重变量分析的数据集,关于数据集的具体介绍:
  2. 具体实现过程:
    (1)导入包:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

(2)编写KNN分类函数:

def knn_iris():
    '''
    用KNN算法对鸢尾花进行分类
    :return:
    '''
    # 1.获取数据
    iris = load_iris()
    # 2.划分数据集
    x_train, x_test ,y_train, y_test = train_test_split(iris.data, iris.target, random_state= 6)
    # 3.特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4.KNN算法预估算
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train,y_train)
    # 5.模型评估
    # (1)直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("比对真实值和预测值:\n", y_test == y_predict)
    # (2)计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n",score)
    return None

(3)调用 knn_iris()函数:

if __name__ == "__main__":
    # 代码1:用KNN算法对鸢尾花进行分类
    knn_iris()

(4)结果:

KNN 距离度量方法_KNN 距离度量方法_03


3. 结果分析:

  • k值取多大?有什么影响?
    k值取得过小,容易受异常值的影响。k之取得过大。容易受到样本不均衡的影响。
  • 性能问题
    距离计算上面,时间复杂度高
  1. 总结
    优点:简单,易于理解,易于实现,无需训练
    缺点:
    (1)懒惰算法,对测试样本分类时的计算量大,内存开销大
    (2)必须指定K值,K值选择不当则分类精度不能保证
    使用场景:
    小数据集,几千~几万样本,具体场景具体业务去测试。