Python分类算法汇总-K最近邻分类算法(鸢尾花分类与预测)

目录

  • K最近邻分类
    • 原理
      • 思路
      • 三个基本要素
      • 距离计算方法
    • KNN算法实现过程
    • KNN算法实现

K最近邻分类

K最近邻(k-Nearest Neighbor,KNN)分类算法,是最简单的机器学习算法之一。算法本身简单有效,它是一种 lazy-learning 算法,分类器不需要使用训练集进行训练,训练时间复杂度为0。 分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为 n,那么算法 的分类时间复杂度为O(n)。

原理

K 近邻算法使用的模型实际上对应于对特征空间的划分。

思路

如果一个样本在特征空间中的k个最“相似”(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。这里的“相似”如果度量?我们使用特征空间中两个点之间“距离”来作为他们的相似度,即两个点“距离”越近则认为他们越相似。

三个基本要素

K 值的选择,距离度量和分类决策规则是该算法的三个基本要素。
K 值的选择会对算法的结果产生重大影响:

  1. K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,但容易发生过拟合;
  2. 如果 K 值较大,优点是可以减少学习的估计误差,但缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。
  3. 在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。
  4. 随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。
  5. 该算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。

距离计算方法

最常见以欧氏距离作为衡量标准。

  1. 欧氏距离 D ( x i , x j ) = ( ∑ k = 1 n ( x i l − x j l ) 2 ) 1 2 D(x_i,x_j)={(\sum_{k=1}^{n}(x_i^l-x_j^l)^2)}^\frac{1}{2} D(xi,xj)=(k=1n(xilxjl)2)21

  2. 明科夫斯基距离
    D ( x i , x j ) = ( ∑ k = 1 n ( x i l − x j l ) p ) 1 p D(x_i,x_j)={(\sum_{k=1}^{n}(x_i^l-x_j^l)^p)}^\frac{1}{p} D(xi,xj)=(k=1n(xilxjl)p)p1

  3. 切比雪夫距离
    D ( x i , x j ) = m a x ∣ x i l − x j l ∣ D(x_i,x_j)=max|x_i^l-x_j^l| D(xi,xj)=maxxilxjl

  4. 马氏距离
    D ( x i , x j ) = ( ( x − μ ) T S − 1 ( x − μ ) ) 1 2 D(x_i,x_j)={((x-μ)^TS^{-1}(x-μ))}^\frac{1}{2} D(xi,xj)=((xμ)TS1(xμ))21

  5. 绝对值距离

  6. 曼哈顿距离
    D ( x i , x j ) = ∑ l = 1 n ∣ x i l − x j l ∣ D(x_i,x_j)={\sum_{l=1}^{n}|x_i^l-x_j^l|} D(xi,xj)=l=1nxilxjl

KNN算法实现过程

  1. 准备数据,对数据进行预处理。
  2. 选用合适的数据结构存储训练数据和测试元组。
  3. 设定参数,如K。
  4. 护一个大小为K的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取K个元组作为初始的最近邻元组,分别计算测试元组到这K个元组的距离,将训练元组标号和距离存入优先级队列。
  5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L与优先级队列中的最大距离Lmax。
  6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L
  7. 遍历完毕,计算优先级队列中K个元组的多数类,并将其作为测试元组的类别。
  8. 测试元组集测试完毕后计算误差率,继续设定不同的K值重新进行训练,最后取误差率最小的K值。

KNN算法实现

该实验利用KNN算法对鸢尾花数据进行分类与与预测。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
import numpy as np
from sklearn.model_selection import train_test_split
if __name__ == '__main__':
    dataset = load_iris()
    X = dataset.data
    y = dataset.target
    Xd_train, Xd_test, y_train, y_test = train_test_split(X, y, random_state=14)
    clf = KNeighborsClassifier(n_neighbors=3).fit(Xd_train,y_train)
    y_predicted = clf.predict(Xd_test)
    # 准确率
    accuracy = np.mean(y_predicted == y_test) * 100
    print ("y_test\n",y_test)
    print ("y_predicted\n",y_predicted)
    print ("accuracy:",accuracy)

Python分类算法汇总-K最近邻分类算法(鸢尾花分类与预测)_第1张图片
正确率为:97.37%

你可能感兴趣的:(Python分类算法汇总-K最近邻分类算法(鸢尾花分类与预测))