精华内容
下载资源
问答
  • k邻近算法

    2017-12-24 13:06:45
    k邻近算法

    今天学习了一点机器学习的知识,主要是机器学习最基本的算法-k邻近算法。正好今天写这篇Blog可以复习巩固,其中涉及到的code和一些内容来自《机器学习实战》。
    在此基础上加了一点自己的注释和理解。这本教程还是挺适合入门的,理论+代码相结合。

    k-近邻算法简述

    k-近邻算法(kNN)采用测量不同特征值之间的距离方法进行分类。工作原理:首先存在一个样本数据集合(训练样本集),并且样本集中每个数据都存在标签(监督学习)。所谓的标签就是样本集每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征相比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中的前k个最相似的数据,这就是k近邻算法中k的出处,k通常不大于20的整数。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。这里的距离是指d=sqrt{(X1-X2)^2+(Y1-Y2)^2}。其中(X1,Y1)表示某个样本的两个特征值。下面以一个具体的例子来说明:电影分类的例子,使用k-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,在这里我们就选取打斗镜头和接吻镜头的次数作为特征来分类,下面显示了六部电影的打斗和接吻镜头次数。假设有一部未看过的电影,如何确定它是爱情片还是动作片?我们使用kNN来确定。

    电影名称                     打斗镜头                     接吻镜头                     电影类型 
    California Man              3                           104                         爱情片
    He's Not Really into Dudes  2                           100                         爱情片
    Beautiful Woman             1                           81                          爱情片
    Kevin Longblade             101                         10                          动作片
    Robo Slayer 3000            99                          5                           动作片
    Amped 2                     98                          2                           动作片
    ?                           18                          90                          未知
    

    首先我们需要知道这个位置电影存在多少个打斗镜头和接吻镜头,数据如上表?数据,只知道打斗镜头和接吻镜头的次数。即使不知道未知电影属于哪种类型,我们也可以通过某种方法求出来。首先计算未知电影与样本集中其他电影的距离。如下表:

    电影名称                        与未知电影的距离
    California Man                    20.5
    He's Not Really into Dudes        18.7
    Beautiful Woman                   19.2
    Kevin Longblade                   115.3
    Robo Slayer 3000                  117.4
    Amped 2                           118.9
    

    在这里我们可以将打斗镜头次数和接吻镜头次数作为两个特征,即(打斗镜头次数,接吻镜头次数),然后计算距离。现在我们知道了样本集中所有电影与未知电影的距离,按照距离递增排序,找到k个距离最近的电影。假定这里k=3,则三个最靠近的电影依次是He’s Not Really into Dudes 、 Beautiful Woman 以及California Man 。k-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型。而这三部全是爱情片,因此我们判定未知电影是爱情片。

    k-近邻算法的一般流程

    1、收集数据:可以使用任何方法。

    2、准备数据:距离计算所需的数值,最好是结构化的数据格式。

    3、分析数据:可以使用任何方法。

    4、训练算法:此步骤不适用于k-近邻算法。

    5、测试算法:计算错误率。

    6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

    关于k-近邻算法如何使用python实现的例子不在此赘述,具体的例子会上传到github,感兴趣的可以去看看,这里只要阐述思想。

    展开全文
  • K邻近算法

    2019-05-09 10:33:00
    1. k邻近算法概述: k邻近算法简单直观,给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类 2. k邻近算法的模型复杂度体现...

    1. k邻近算法概述:

    k邻近算法简单直观,给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类

    2. k邻近算法的模型复杂度体现在哪里?什么情况下会造成过拟合

    k邻近算法模型复杂度体现在k值,k比较小时容易造成过拟合,k较大时容易造成欠拟合

    3. 线性扫描算法

    线性扫描算法步骤如下:

    输入:训练数据集T={(x1,y1),(x2,y2),...(xn,yn)}

         待预测数据:(x_test)

         k值

    (1)计算x_test与 xi的欧式距离

    (2)欧式距离排序

    (3)取前k个最小距离,对应训练数据点的类型y

    (4)对k个y值进行统计

    (5)返回频率出现最高的点

     1 import numpy as np
     2 from collection import Counter
     3 from draw import draw
     4 class KNN:
     5     def _init_(self,x_train,y_train,k=3):
     6         self.k=k
     7         self.x_train=x_train
     8         self.y_train=y_train
     9         
    10     def predict(self,x_new):
    11         #计算欧式距离
    12         dist_list=[(np.linalg.norm(x_new=self.x_train[i],ord=2),self.y_train[i])
    13                   for i in range(self.x_train.shape[0])]
    14         dist_list.sort(key=lambda x: x[0])                  
    15         y_list=[dist_list[i][-1] for i in range(self.k)]
    16         #对上述k个点的分类进行统计
    17         y_count=Counter(y_list).most_common()
    18         return y_count[0][0]
    19     
    20 def main():
    21     #首先输入训练数据
    22     x_train=np.array([[5,4],
    23                       [9,6],
    24                       [4,7],
    25                       [2,3],
    26                       [8,1],
    27                       [7,2]])
    28     y_train=np.array([1,1,1,-1,-1,-1])
    29     输入测试数据
    30     x_new=np.array([5,3])
    31     #绘图
    32     draw(x_train,y_train,x_new)
    33     for k in range(1,6,2):
    34         #构建KNN实例
    35         elf=KNN(x_train,y_train,k=k)
    36         #对测试数据进行分类
    37         y_predict=elf.predict(x_new)
    38         print("k={},被分类为:{}").format(k,y_predict)
    39 if __name__ == "main":
    40     main()

     

    转载于:https://www.cnblogs.com/Cucucudeblog/p/10830615.html

    展开全文
  • k邻近算法实现

    2018-07-19 10:03:47
    K邻近算法采用测量不同特征值之间的距离方法来进行分类。
  • kNN - k邻近算法

    2019-11-05 15:56:08
    k邻近算法就解释完了,按照惯例,还是应该给出k邻近算法的官方定义,我从百度百科上拷贝过来了 K近邻算法:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也...

    k邻近算法就解释完了,按照惯例,还是应该给出k邻近算法的官方定义,我从百度百科上拷贝过来了

    K近邻算法:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

    下面在Jupyter Notebook中一步一步实现k邻近算法

    可在我的github下载notebook文件

    https://github.com/CodingSoldier/python-learn/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/notebook/04-knn-k%E8%BF%91%E9%82%BB%E7%AE%97%E6%B3%95/01-knn%E5%AE%9E%E7%8E%B0-%E6%95%99%E7%A8%8B.ipynb

    knn.py的代码如下:

    # -*- coding: utf-8 -*-
    
    import numpy as np
    from math import sqrt
    from collections import Counter
    
    def knn_classify(k, X_train, y_train, x):
    
        assert 1 <= k <= X_train.shape[0], "k要大于等于1,小于等于数组X_train第一维大小"
        assert X_train.shape[0] == y_train.shape[0], "数组X_train第一维大小要等于数组y_train第一维大小"
        assert X_train.shape[1] == x.shape[0], "数组X_train第二维大小要等于预测点x第一维大小"
    
        distances = [sqrt(np.sum((dot -x)**2)) for dot in X_train]
        nearest = np.argsort(distances)
    
        top_k_y = [y_train[i] for i in nearest[:k]]
        votes = Counter(top_k_y)
    
        return votes.most_common(1)[0][0]
    
    

     

     

     

    展开全文
  • K邻近算法实现iris数据的识别,源代码.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,218
精华内容 887
关键字:

k邻近算法