zoukankan      html  css  js  c++  java
  • 第四章 K-近邻算法

    1.什么是K近邻算法

    最直观的解释就是:给定一个训练数据集,对于新的输入实例,在训练集中找到与该实例最近邻的 k 个实例,这 k 个实例的多数属于哪个类,则该实例就属于哪个类。

    2.K近邻算法的优缺点

    优点:精度高,对异常值不敏感

    缺点:计算复杂度高,空间复杂度高

    3.K近邻算法关键点分析

    由K近邻算法的解释,这将分下述关键点讲解:

      3.1.找到与该实例最近邻的实例,这里就涉及到如何找到,即在特征向量空间中,我们要采取何种方式来对距离进行度量,这是我们要考虑的第一个问题。距离决定了数据数据点的相似程度,即分类的量度信息。

      通常计算距离的方法由曼哈顿距离和欧式距离,其余参考的还有余弦距离、切比雪夫距离等。

      以下是常用的欧式距离公式:

      

      3.2. k 个实例中个 k 值的大小如何选择。

      一般而言,k 值的大小对分类结果有着重大的影响。当选择的 k 值较小的情况下,就相当于用较小的邻域中的训练实例进行预测,只有当与输入实例较近的训练实例才会对预测结果起作用。但与此同时预测结果会对实例点非常敏感,分类器抗噪能力较差,因而容易产生过拟合,所以一般而言,k 值的选择不宜过小。但如果选择较大的 k 值,就相当于在用较大邻域中的训练实例进行预测,但相应的分类误差也会增大,模型整体变得简单,会产生一定程度的欠拟合。所以一般而言,我们需要采用交叉验证的方式来选择合适的 k 值。

      3.3. k 个实例的多数属于哪个类。

      这里只需要计算所选K个值种每个类别出现的额频率,频率最高的就是算法输出结果。

    4.使用sklearn-knn进行多分类实例演示

    #导入相关库  由于实际使用模块较多,这里是所有工程需要库,不必全部导入
    import numpy as np import pandas as pd from pandas import read_csv from pandas.plotting import scatter_matrix from matplotlib import pyplot as plt from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.model_selection import StratifiedKFold from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score
    #导入封装好的KNN算法
    from sklearn.neighbors import KNeighborsClassifierfrom sklearn import metrics from collections import Counter from sklearn.externals import joblib import time

    #解决matplotlib中文显示乱码问题

      plt.rcParams['font.family'] = ['sans-serif']
      plt.rcParams['font.sans-serif'] = ['SimHei']

      #导入数据 

      #数据读取与划分数据集
      #random_state参数将随机种子设置为固定数字,以确保每种算法都在训练数据集的相同分割上进行评估。
      data = pd.read_csv("E:\Mywork\分类器\file\Data_1.csv")
      print(data.shape)
      print(data.head())
      array = data.iloc[:,:].values

      X = array[:,1:3]
      y = array[:,3]
      X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.1, random_state=1)

      #查看数据分布状况

      plt.scatter(X_train[:,0], X_train[:,1],c = Y_train)  

      plt.show()

      

      

      #Surpervised KNN
      #Knn网络参数详解
      '''
      class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’,
      algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None,
      n_jobs=1, **kwargs)
      1.n_neighbors : 一个整数,指定k值。
      2.weights:字符串或可调用对象,指定投票权重类型。
      uniform:节点附件邻居节点的投票权重都相等。
      distance:投票权重与距离成正比。节点越近权重越大。
      [callable]:一个可调用对象,它传入距离的数组,返回同样形状的权重数组。
      3.algorithm:一个字符串,指定最近邻算法。
      ball_tree : 使用BallTree算法。
      kd_tree : 使用KDTree算法。
      brute : 使用暴力搜索算法。
      auto : 自动决定最合适算法
      4.leaf_size:一个int,指定BallTree或者KDTree叶节点的规模。影响树的构建和查询速度。
      5.metric:一个str,指定距离量度。默认为'minkowski'
      6.P:int
      1.曼哈顿距离。
      2.欧式距离。
      '''

      #使用Sklearn构建KNN算法
      KNN_model = KNeighborsClassifier(n_neighbors = 3,leaf_size = 30,p = 2,)
      KNN = KNN_model.fit(X_train,Y_train)
      y_pred_KNN = KNN.predict(X_validation)
      y_pred_raw = KNN.predict(data_test_1)
      #评估预测
      print("训练集:", KNN.score(X_train, Y_train))
      print("测试集:", KNN.score(X_validation, Y_validation))
      print(accuracy_score(Y_validation,y_pred_KNN))
      print(confusion_matrix(Y_validation, y_pred_KNN))
      print(classification_report(Y_validation, y_pred_KNN))
      plt.title('测试集效果')
      plt.scatter(X_validation[:,0],X_validation[:,1],c = y_pred_KNN)

      输出

      

  • 相关阅读:
    Flask:flask-script;多app应用;wtforms
    Flask:Locla;偏函数;请求上下文;蓝图;g对象;信号;flask-session
    Flask:闪现; 请求扩展;自定义中间件
    Flask:cookie和session
    Flask:请求与响应
    Flask:重定向;模板语法,
    Flask:路由系统;CBV的代码案例
    软件质量模型
    Selenium with Python 002
    Selenium with Python 001
  • 原文地址:https://www.cnblogs.com/peiziming/p/12737727.html
Copyright © 2011-2022 走看看