zoukankan      html  css  js  c++  java
  • sklearn.neighbors.KNeighborsClassifier的k-近邻算法使用介绍

    class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, 
    p=2, metric=’minkowski’,
    metric_params=None, n_jobs=None, **kwargs)

    Source code:https://github.com/scikit-learn/scikit-learn/blob/1495f6924/sklearn/neighbors/classification.py#L23

    1,KNeighborsClassifier参数介绍

    n_neighbors: int,默认值为5

      表示k-nn算法中选取离测试数据最近的k个点,

    weight: str or callable,默认值为uniform

      表示k近邻点都分类结果的影响,一般的情况下是选取k近邻点中类别数目最多的作为分类结果,这种情况下默认k个点的权重相等,但在很多情况下,

      k近邻点权重并不相等,可能近的点权重大,对分类结果影响大。

      默认值为uniform,还可以是distance和自定义函数

    • 'uniform':表示所有点的权重相等
    • 'distance':表示权重是距离的倒数,意味着k个点中距离近的点对分类结果的影响大于距离远的点
    • [callable]:用户自定义函数,接受一个距离数组,返回一个同维度的权重数

    algorithm:{'ball_tree','kd_tree','brute','auto'}

      计算找出k近邻点的算法

    • 'ball_tree':使用BallTree维数大于20时建议使用
    • 'kd_tree':使用KDTree,原理是数据结构的二叉树,以中值为划分,每个节点是一个超矩形,在维数小于20是效率高
    • 'brute':暴力算法,线性扫描
    • 'auto':自动选取最合适的算法

      note:在稀疏的输入数据上拟合,将使用'brute'覆盖此参数

    leaf_size:int,默认值为30

      用于构造BallTree和KDTree

      leaf_size参数设置会影响树构造的树构造和询问的速度,同样也会影响树存储需要的内存,这个值的设定取决于问题本身

    p:int,默认值为2

    • 1:使用曼哈顿距离进行度量
    • 2:使用欧式距离进行度量

    metric string or callable, 默认使用'minkowski'(闵可夫斯基距离),度量函数

     

      其中p是一个变参数,也就是上一个介绍的参数p

      当p=1时,就是曼哈顿距离

      当p=2时,就是欧氏距离

      当p→∞时,就是切比学夫距离

    metric_params dict, 默认为None

      度量函数的其他关键参数,一般不用设置

    n_jobs int or None, 默认None

      用于搜索k近邻点并行任务数量,-1表示任务数量设置为CPU的核心数,即CPU的所有core都并行工作,不会影响fit(拟合)函数

    注意:关于如何选择algorithm 和 leaf_size参数,请查看Nearest Neighborsi的在线文档。

    警告:根据Nearest Neighbors算法,如果找到两个邻居,例如邻居k+1和k,他们有着一样的距离但是不一样的标签,最后的结果会根据训练数据的顺序来决定。

    https://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm

    fit(self, X, y) 使用X作为训练集作为便签集,来拟合模型
    get_params(self[, deep]) 获得估计器的参数
    kneighbors(self[, X, n_neighbors, …]) 查找X数组X数组中所有点的K邻居点
    kneighbors_graph(self[, X, n_neighbors, mode]) 计算X中每个点的K邻居权重图
    predict(self, X) 预测X数据集中每个点对应的标签
    predict_proba(self, X) 返回X数据集中对应每个标签的概率估计值
    score(self, X, y[, sample_weight]) 返回给定数据集和标签的平均准确率 
    set_params(**params)  设置估计器的参数

      

      

    __init__(self, n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)

    [source]

    fit(selfXy)

    使用X作为训练集,y作为标签集,拟合模型

    参数

    X:{类似数组,稀疏矩阵,BallTree,KDTree}

      训练集:如果是数组或者矩阵,形状为[n_samples, n_features],如果参数metric='precomputed',形状为[n_samples, n_samples]

    y:{类似数组,稀疏矩阵}

      标签集:形状为[n_samples]或者[n_samples, n_outputs]

    get_params(selfdeep=True)

    获取估计器的参数

    参数

    deep:boolean,可选

      如果为True,返回估计器的参数,以及包含子估计器

    返回值

    Returns:mapping of string to any

      返回Map变量,内容为[参数值:值, 参数值:值, ...] 

     

    kneighbors(X=None,n_neighbors=None,return_distance=True)

    查询X数组中的K邻居点,返回每个点的下标和查询点和邻居点之间的距离

    参数:

    X:类型数组,形状为 (n_query, n_features),如果参数metric == ‘precomputed’形状为(n_query, n_indexed) 

      在没有提供查询点的情况下,则返回有下标点的邻居们,这种情况下,没有考虑查询点的邻居们

    n_neighbors:int

      返回的邻居点的个数(默认使用改造器是设定的n_neighbors值

    return_distance:boolean,可选。 默认为True 

      如果为False,距离值就不会返回

    返回值:

    Returns:

      dist:数组

        当return_distance=True是,返回到每个近邻点的距离

      ind:数组

        返回近邻点的下标

     例子

    在下面例子中,我们从给定数据集中构建一个NeighborsClassifier类,并询问哪个点最接近[1, 1, 1]

    from sklearn.neighbors import NearestNeighbors
    samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
    neigh = NearestNeighbors(n_neighbors=1)
    neigh.fit(samples)
    print(neigh.get_params())
    print(neigh.kneighbors([[1., 1., 1.]]))

    {'algorithm': 'auto', 'leaf_size': 30, 'metric': 'minkowski', 'metric_params': None, 'n_jobs': None, 'n_neighbors': 1, 'p': 2, 'radius': 1.0}
    (array([[0.5]]), array([[2]], dtype=int64))

    因为n_neighbors=1,所有只返回一个点的数据[[0.5]]意味着近邻点与查询点的距离为0.5,而[[2]]意味着这个近邻点的下标,同样你也可以查询多个点

    X = [[0., 1., 0.], [1., 0., 1.]]
    print(neigh.kneighbors(X, return_distance=False))

    [[1],[2]]

     [[1],[2]]表示,第一个查询点的近邻点下标为1,同样第二个查询点的近邻点下标为2

    kneighbors(selfX=Nonen_neighbors=Nonereturn_distance=True)

    计算X数组中每个点的k邻居权重图

    参数:

      X:类似数组,形状为 (n_query, n_features),如果参数metric == ‘precomputed’,形状为 (n_query, n_indexed)

        一个或者多个查询点,如果没有提供,则返回每个有下标的邻居们

      n_neighbors int

        每个查询的邻居数量(默认使用拟合时设置的n_neighbors)
      mode {‘connectivity’, ‘distance’}, 可选

        返回矩阵类型:'connectivity',返回0和1组成的矩阵,'distance',返回点与点之间的欧几里得距离

    返回值:

      A:CSR格式的稀疏矩阵,形状为[n_samples, n_samples_fit]

        n_samples是拟合过程中样例的数量,A[i, j]是i到j的权重

     关联:kneighbors_graph

    from sklearn.neighbors import NearestNeighbors
    X = [[0], [3], [1]]
    neigh = NearestNeighbors(radius=1.5)
    neigh.fit(X)
    A = neigh.radius_neighbors_graph(X)
    print(A.toarray())

    [[1. 0. 1.]
    [0. 1. 0.]
    [1. 0. 1.]]

    predict(selfX)

    预测提供的数据对应的类别标签

    参数:

      X:类似数组,形状为(n_query, n_features),如果参数metric == 'precomputed',形状为(n_query, n_indexed) 

        待测试数据

    返回值:

      y:形状为[n_samples]或者为[n_samples, n_outputs]

        每个待测试样例的类别标签

    predict_proba(selfX)

    预测X中每个测试样例对应每个类别的概率估计值

    参数:

      X:类似数组,形状为(n_query, n_features),如果参数metric == 'precomputed',形状为(n_query, n_indexed) 

        带测试样例

    返回值:

      p:形状为[n_samples, n_classes],或者n_outputs列表

        输出每个样例对于每个类别的概率估计值,类别按照字典顺序排序

    from sklearn.neighbors import KNeighborsClassifier
    X = [[0], [1], [2], [3]]
    y = [0, 0, 1, 1]
    neigh = KNeighborsClassifier(n_neighbors=3)
    neigh.fit(X, y)
    print(neigh.predict([[1.1]]))
    print(neigh.predict_proba([[1.1]]))

    [0]
    [[0.66666667 0.33333333]]

    解释:[0]表示预测[1.1]属于类型0,而[[0.66666667 0.33333333]]表示[1,1]属于类型0的概率为0.66666667,属于类型1的概率为0.33333333

    score(selfXysample_weight=None)

    返回给定测试集和标签的平均准确度。在多标签分类中,返回各个子集的准确度

    参数:

      X:类似数组,形状为 (n_samples, n_features)

        测试数据
      y:类似数组,形状为(n_samples)或者(n_samples, n_outputs)

        X对应的正确标签

      sample_weight : 类似数组,形状为[n_samples], 可选    

        样例的权重

    返回值:

      score float

        self.predict(X)关于y的平均准确率

    from sklearn.neighbors import KNeighborsClassifier
    X = [[0], [1], [2], [3]]
    y = [0, 0, 1, 1]
    neigh = KNeighborsClassifier(n_neighbors=3)
    neigh.fit(X, y)
    print(neigh.predict([[1.1], [2.1], [3.1]]))
    print(neigh.score([[1.1], [2.1], [3.1]], [0, 1, 0]))

    [0 1 1]
    0.6666666666666666

     可以看出3个测试数据,预测类别有2个正确,1个错误,所有准确率为0.6666666666666666

    set_params(self**params)

    设置估计器的参数

    这个方法不仅对于单个估计器,而且对于嵌套对象(类如管道)都有效,而嵌套对象有着<component>__<parameter>形式的参数,所以可以更新嵌套对象的每个参数

    返回值:

      self

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/YukiNote/p/11381246.html
Copyright © 2011-2022 走看看