特征工程
把特征转换为机器容易识别的数据,把特征a转化为机器容易读懂、量化的语言
归一化Min-Max
将原始数据映射到[0,1]之间
  
      
       
        
         
         
           X 
          
         
           ′ 
          
         
        
          = 
         
         
          
          
            x 
           
          
            − 
           
          
            m 
           
          
            i 
           
          
            n 
           
          
          
          
            m 
           
          
            a 
           
          
            x 
           
          
            − 
           
          
            m 
           
          
            i 
           
          
            n 
           
          
         
        
       
         X'= \frac{x-min}{max-min} 
        
       
     X′=max−minx−min
 但是归一化是有弊端的,比如有一个值错误,就会影响整体的数值,并且归一化是无法解决这个异常值。所以归一化只适合传统精确小数据场景。
标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。也就是服从正态分布的数据。
  
      
       
        
         
         
           X 
          
         
           ′ 
          
         
        
          = 
         
         
          
          
            x 
           
          
            − 
           
          
            m 
           
          
            e 
           
          
            a 
           
          
            n 
           
          
         
           σ 
          
         
        
       
         X'=\frac{x-mean}{\sigma} 
        
       
     X′=σx−mean
K-近邻算法(K-Nearest Neighboor)
定义
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
理念
取近的邻居,本质为近朱者赤近墨者黑,比如可以通过身边的住户预测本区域送外卖的是哪些人。所以就要用欧式距离计算出跟邻居的距离,找出最近的邻居(k=1)。
 问题:只有1个的话数据不够精准,被噪点的干扰太强,数据有误差的话就会被完全带偏。
 解决:要找k个邻居,自己写代码实现knn。knn算法也可以用于动态加载的字体反爬。
理解K近邻
已知《战狼》、《红海行动》、《碟中谍6》是动作片,而《前任3》、《春娇与志明》、《泰坦尼克号》是爱情片。每一行(一部电影)为一个数据样本,特征列为打斗次数、接吻次数,根据打斗次数和接吻次数来区分是爱情片和动作片。如果新的电影如《美人鱼》,人可以根据自己经验将电影进行分类,也可以让机器也可以掌握一个分类的规则,自动的将新电影进行分类。
 
 对图中的数据进行整理,绘制散点图如下:
 
通过分析结果可以看出,动作片的打斗场景非常多,根据《美人鱼》电影的数据,可以大致判断出在图中红色圆圈的位置。现在就要判断出红色圆圈距离哪一个样本点比较近,如果距离《春娇与志明》比较近,就可以归类为爱情片,如果距离《红海行动》比较近的话就可以归类为动作片。
 两点之间的直线距离最近。
 
 在机器学习中说到两点之间的距离,通常指的是欧式距离,二维欧式距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
          
            ( 
           
           
           
             x 
            
           
             1 
            
           
          
            − 
           
           
           
             x 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             y 
            
           
             1 
            
           
          
            − 
           
           
           
             y 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} 
        
       
     d12=(x1−x2)2+(y1−y2)2
 特征不可能说只有两个,每个特征代表一个维度,同理衍生三维欧氏距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
          
            ( 
           
           
           
             x 
            
           
             1 
            
           
          
            − 
           
           
           
             x 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             y 
            
           
             1 
            
           
          
            − 
           
           
           
             y 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             z 
            
           
             1 
            
           
          
            − 
           
           
           
             z 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} 
        
       
     d12=(x1−x2)2+(y1−y2)2+(z1−z2)2
 如果是四维或者更高维度,归纳N维欧式距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
           
           
             ∑ 
            
            
            
              k 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             x 
            
           
             i 
            
           
          
            − 
           
           
           
             y 
            
           
             i 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{\sum_{k=1}^n(x_i-y_i)^2} 
        
       
     d12=k=1∑n(xi−yi)2
 对距离进行精准计算,以两点(美人鱼、碟中谍6)为例进行求解,
# 美人鱼:5  29
# 碟中谍6: 105 31
np.sqrt((105-5)**2+(31-29)**2)  # 100.0199980003999
 

 如果要算出最近距离,则需要算《美人鱼》与各个特征点之间的距离。从计算结果可以看出,距离《美人鱼》最近的电影是《前任3》,如果只从一个特征点去判定的话,结果可能会不精确。这时要选择更多(K值)的附近特征值进行比较,如果选择K=3,选择距离最近的3个,选择的特征值为《前任3》、《春娇与志明》、《泰坦尼克号》,这三个都是爱情电影,可以把《美人鱼》归类为爱情电影。如果选择K=4,就会出现3个爱情电影,1个动作电影,此时就选择众数,将数据归类为出现次数最多的特征里。
 如果只用一个特征点的距离就判断类型的话是不可靠的,如下图
 
 xiaoming其实是在二七区,但是跟B同学的距离最近,这是一个分类的问题,在K近邻算法中,以半径的方式划圈,但是并不能说xiaoming就在中原区,分类问题不能算成均值。如果选择五名同学进行计算,分别计算跟每个同学的距离,要选择类别为众数的,才能更加可靠的来判断出xiaoming所在的区域。xiaoming距离C、D同学最近,E、F同学较远,才能准确的判断xiaoming在哪个区域。
KNN工作流程
- 计算待分类物体与其他物体之间的距离;
 - 统计距离最近的 K 个邻居;
 - 对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
基于流程使用numpy和pandas去实现算法。


用编程来实现,就要用到面向对象的编程思想,可以实现动态传参、继承等,避免了函数间的反复接受和调用,实例属性在所有的实例方法立都可以使用。要先封装一个类然后定义一个main()方法,在主程序的方法里进行实例化、调用方法的过程。
在main()方法里读取数据后,并不能将所有的数据传进去做处理,要把数据划分为初始化的特征,训练特征:打斗次数、亲吻次数;训练目标:电影类型;预测数据;实例化类,传入训练特征、目标数据和K值。
要把得到的数据传到类中,在类里创建初始化的方法来初始化属性。
创建预测方法,实现预测《美人鱼》电影属于哪个分类,计算预测数据和真实数据的欧式距离,获取距离最小的前K 个值,对K个点的分类进行统计。此时统计的是当k为确定的值时得到的结果,如果要测试多个,可以进行循环遍历,k最好取奇数。 
小结
- 计算欧式距离
 - 取最近的k个邻居
 - 利用numpy和pandas的广播机制,效率比python的循环要高
 - 选择数据。 
  
-  
    
- df.loc[行标签,列标签],通过标签选择数据
 
 - 2.df.iloc[行下表,列下标],通过下标/索引选择数据
 
 -  
    
 - 1个邻居不可靠,需要选择多个邻居,求的是类别,不是均值。
 
K-近邻算法api介绍
scikit-learn工具介绍
scikit-learn是基于python语言的机器学习工具。参考说明文档:http://scikitlearn.com.cn
- Python语言是简单高效的数据挖掘和数据分析工具
 - Scikit-learn包括许多知名的机器学习算法的实现
 - Scikit-learn文档完善,容易上手,有丰富的API
 
scikit-learn的安装
pip3 install scikit-learn
 
注意:安装scikit-learn,需要提前安装numpy,Scipy等库
scikit-learn实现K近邻算法–分类问题
从sklearn包下的neighbors模块,调用所用到的KNeighborsClassifier分类器,n_neighbors为指定的K值,
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto')
n_neighbors:查询默认使用的邻居数(默认为 5) 
weights:默认为 “uniform” 表示为每个近邻分配同一权重;
可指定为 “distance” 表示分配权重与查询点的距离成反比;同时还可以自定义权重。
 

从题目中看到1-,-2是同类别的,为0类别;2,3为同类别的,为1类别。传入的1特征,选择了2个近邻,不仅会找到跟1最近的2,还会找到跟1次近的-1,此时-1和2是同权重的,根据现有的特征数据和结果去训练模型,按距离近的用 weights=‘distance’ 增加权重。
实现电影分类的案例

scikit-learn实现K近邻算法–总结
- 构建特征数据与目标数据
 - 构建k个近邻的分类器(两个参数:n_neighbors,weights)
 - 使用fit进行训练
 - 预测数据
 
K值选择
如果 K 值比较小就相当于未分类物体与它的邻居非常接近才行。这样产生的一个问题就是,如果邻居点是个噪声点,那么未分类物体的分类也会产生误差,这样 KNN 分类就会产生过拟合。通过输入的数据去预测类别,输入的数据要与训练的实例接近才会有结果,如果只取了一个实例(k的取值过小),好比每天只练习一种题型,考试的时候遇到复杂的题型就会不知所措,只会记住自己训练出来的模板,对一种题型训练过度,就出现过拟合的现象。
 如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况的好处是鲁棒性强,但是不足也很明显,会受到样本均衡的影响,产生欠拟合情况,也就是没有把未分类物体真正分类出来。k值过大,抗风险能力比较强,好比备考的时候,什么题型都看(海纳百川),那任何一部电影传进来,都会见过类似的。考试的知识点是初中的,备考的时候复习了小学、初中、高中、大学的内容,考试的时候就不知道用初中、高中、还是大学的知识去解题(都接触过,又都不那么深入),分不清对应的考点,就会有欠拟合的现象。
 用N个K值从小到大进行测试,选择结果最好的那个K值,人为的一个一个的测试会很繁琐,可以用交叉验证。交叉验证的思路就是,把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在 KNN 算法中,我们一般会把 K 值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为 K 值。
距离计算
- 欧氏距离(欧几里得距离)
 - 曼哈顿距离
 - 闵可夫斯基距离
 - 切比雪夫距离
 - 余弦距离
 
欧式距离
欧式距离代表的是两点之间的距离作为的衍生,比如现在在408教室上课,有位同学要去隔壁的508教室,不能根据距离直接穿过去,二维欧式距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
          
            ( 
           
           
           
             x 
            
           
             1 
            
           
          
            − 
           
           
           
             x 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             y 
            
           
             1 
            
           
          
            − 
           
           
           
             y 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} 
        
       
     d12=(x1−x2)2+(y1−y2)2
 衍生三维欧氏距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
          
            ( 
           
           
           
             x 
            
           
             1 
            
           
          
            − 
           
           
           
             x 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             y 
            
           
             1 
            
           
          
            − 
           
           
           
             y 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
            + 
           
          
            ( 
           
           
           
             z 
            
           
             1 
            
           
          
            − 
           
           
           
             z 
            
           
             2 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} 
        
       
     d12=(x1−x2)2+(y1−y2)2+(z1−z2)2
 归纳N维欧式距离公式如下:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
           
           
             ∑ 
            
            
            
              k 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ( 
           
           
           
             x 
            
           
             i 
            
           
          
            − 
           
           
           
             y 
            
           
             i 
            
           
           
           
             ) 
            
           
             2 
            
           
          
         
        
       
         d_{12} = \sqrt{\sum_{k=1}^n(x_i-y_i)^2} 
        
       
     d12=k=1∑n(xi−yi)2
- 涉及到开根号,就会涉及到浮点数,甚至是无线无限循环小数。在机器学习中的特征一般都是高纬(超越了3个维度)的,再涉及到小数,就会有误差,对内存的消耗很大,计算机的运行速度就会很慢。为了解决这个问题,就尽量的进行整数的计算,引入曼哈顿距离。
 
曼哈顿距离
在几何空间中用的比较多,比如a同学在408,b同学在512,从a到达b,中间的格子都是墙,不可能从a走绿色的线穿墙而过,最终目的也要使得路程最短。可以从a点先往上走,距离为 
     
      
       
        
        
          y 
         
        
          2 
         
        
       
      
        y_2 
       
      
    y2和 
     
      
       
        
        
          y 
         
        
          1 
         
        
       
      
        y_1 
       
      
    y1的差值,然后横向走,距离为 
     
      
       
        
        
          x 
         
        
          2 
         
        
       
      
        x_2 
       
      
    x2和 
     
      
       
        
        
          x 
         
        
          1 
         
        
       
      
        x_1 
       
      
    x1的差值,才能到达最终的终点。通过两段距离的和,求出两点之间的距离。
 通过下图可以看出,不管如何顺着格子走,两点之间的距离是一定的。
 
二维平面两点 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          1 
         
        
       
         , 
        
        
        
          y 
         
        
          1 
         
        
       
         ) 
        
       
      
        a(x_1,y_1) 
       
      
    a(x1,y1)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          2 
         
        
       
         , 
        
        
        
          y 
         
        
          2 
         
        
       
         ) 
        
       
      
        b(x_2,y_2) 
       
      
    b(x2,y2)间的曼哈顿距离:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
        
          ∣ 
         
         
         
           x 
          
         
           1 
          
         
        
          − 
         
         
         
           x 
          
         
           2 
          
         
        
          ∣ 
         
        
          + 
         
        
          ∣ 
         
         
         
           y 
          
         
           1 
          
         
        
          − 
         
         
         
           y 
          
         
           2 
          
         
        
          ∣ 
         
        
       
         d_{12}=| x_1-x_2 | +\mid y_1-y_2 \mid 
        
       
     d12=∣x1−x2∣+∣y1−y2∣
 n维空间点 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          11 
         
        
       
         , 
        
        
        
          x 
         
        
          12 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           1 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        a(x_{11},x_{12},...,x_{1n}) 
       
      
    a(x11,x12,...,x1n)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          21 
         
        
       
         , 
        
        
        
          x 
         
        
          22 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           2 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        b(x_{21},x_{22},...,x_{2n}) 
       
      
    b(x21,x22,...,x2n)的曼哈顿距离:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
          
            ∑ 
           
           
           
             k 
            
           
             = 
            
           
             1 
            
           
          
            n 
           
          
         
           ( 
          
          
          
            x 
           
           
           
             1 
            
           
             k 
            
           
          
         
           − 
          
          
          
            x 
           
           
           
             2 
            
           
             k 
            
           
          
         
           ) 
          
         
        
       
         d_{12} = {\sum_{k=1}^n(x_{1k}-x_{2k})} 
        
       
     d12=k=1∑n(x1k−x2k)
- 曼哈顿距离也被称为出租车几何,在城市中开车不能穿墙而过,只能根据房子周边的路线去走。在高维中进行整数计算,只用到了加减的运算,避免了小数的计算(不至于出现无线循环小数,或者是无理数),运算速度比较快,并且误差很小。
 
切比雪夫距离
在国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子 
     
      
       
       
         ( 
        
        
        
          x 
         
        
          1 
         
        
       
         , 
        
        
        
          y 
         
        
          1 
         
        
       
         ) 
        
       
      
        (x_1,y_1) 
       
      
    (x1,y1)走到格子 
     
      
       
       
         ( 
        
        
        
          x 
         
        
          2 
         
        
       
         , 
        
        
        
          y 
         
        
          2 
         
        
       
         ) 
        
       
      
        (x_2,y_2) 
       
      
    (x2,y2)最少需要走多少步?这个距离就叫切比雪夫距离。
 
 从上图可以看出从2A到5C点所经过的距离,可以是先从2A走到2C(2步),然后从2C走到5C(3步);也可以是先从2A走到4C(2步),然后从4C走到5C(1步)。第二种走的步数刚好为第一中走的两部分步数的最大值。
 二维平面两点 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          1 
         
        
       
         , 
        
        
        
          x 
         
        
          2 
         
        
       
         ) 
        
       
      
        a(x_1,x_2) 
       
      
    a(x1,x2)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          2 
         
        
       
         , 
        
        
        
          y 
         
        
          2 
         
        
       
         ) 
        
       
      
        b(x_2,y_2) 
       
      
    b(x2,y2)间的切比雪夫距离:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
        
          ∣ 
         
         
         
           x 
          
         
           1 
          
         
        
          − 
         
         
         
           x 
          
         
           2 
          
         
        
          ∣ 
         
        
          , 
         
        
          ∣ 
         
         
         
           y 
          
         
           1 
          
         
        
          − 
         
         
         
           y 
          
         
           2 
          
         
        
          ∣ 
         
        
          ) 
         
        
       
         d_{12}=max(| x_1-x_2 | ,\mid y_1-y_2 \mid) 
        
       
     d12=max(∣x1−x2∣,∣y1−y2∣)
 n维空间点 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          11 
         
        
       
         , 
        
        
        
          x 
         
        
          12 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           1 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        a(x_{11},x_{12},...,x_{1n}) 
       
      
    a(x11,x12,...,x1n)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          21 
         
        
       
         , 
        
        
        
          x 
         
        
          22 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           2 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        b(x_{21},x_{22},...,x_{2n}) 
       
      
    b(x21,x22,...,x2n)的切比雪夫距离:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
        
          m 
         
        
          a 
         
        
          x 
         
        
          ( 
         
        
          ∣ 
         
         
         
           x 
          
          
          
            1 
           
          
            i 
           
          
         
        
          − 
         
         
         
           x 
          
          
          
            2 
           
          
            i 
           
          
         
        
          ∣ 
         
        
          ) 
         
        
       
         d_{12}=max(| x_{1i}-x_{2i} | ) 
        
       
     d12=max(∣x1i−x2i∣)
闵可夫斯基距离
闵式距离是一类距离的同城,是对多个距离度量公式的概括性的表述。闵可夫斯基距离是个通过的指标,通过变换参数来更换极限形式,
 两个n维变量 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          11 
         
        
       
         , 
        
        
        
          x 
         
        
          12 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           1 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        a(x_{11},x_{12},...,x_{1n}) 
       
      
    a(x11,x12,...,x1n)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          21 
         
        
       
         , 
        
        
        
          x 
         
        
          22 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           2 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        b(x_{21},x_{22},...,x_{2n}) 
       
      
    b(x21,x22,...,x2n)的闵可夫斯基距离定义为:
  
      
       
        
         
         
           d 
          
         
           12 
          
         
        
          = 
         
         
          
           
           
             ∑ 
            
            
            
              k 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
          
            ∣ 
           
           
           
             x 
            
            
            
              1 
             
            
              k 
             
            
           
          
            − 
           
           
           
             x 
            
            
            
              2 
             
            
              k 
             
            
           
           
           
             ∣ 
            
           
             p 
            
           
          
         
           p 
          
         
        
       
         d_{12} = \sqrt[p]{\sum_{k=1}^n|x_{1k}-x_{2k}|^p} 
        
       
     d12=pk=1∑n∣x1k−x2k∣p
 其中p是一个变参数:
- 当 p = 1 p=1 p=1时,根号就不存在了,就是曼哈顿距离;
 - 当 p = 2 p=2 p=2时,就是欧式距离;
 - 当 p → ∞ p\to \infty p→∞时,取极限的最大值,忽略最小值,就是切比雪夫距离
 
余弦距离
余弦距离实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对数值不敏感。sin函数是对边比斜边,cos函数是临边比斜边,引申出来两个向量之间的夹角余弦公式。夹角余弦的取值为-1到1,余弦越大就表示向量的夹角越小。
 二维空间中向量 
     
      
       
       
         A 
        
       
         ( 
        
        
        
          x 
         
        
          1 
         
        
       
         , 
        
        
        
          y 
         
        
          1 
         
        
       
         ) 
        
       
      
        A(x_1,y_1) 
       
      
    A(x1,y1)与向量 
     
      
       
       
         B 
        
       
         ( 
        
        
        
          x 
         
        
          2 
         
        
       
         , 
        
        
        
          y 
         
        
          2 
         
        
       
         ) 
        
       
      
        B(x_2,y_2) 
       
      
    B(x2,y2)的夹角余弦公式:
  
      
       
        
        
          c 
         
        
          o 
         
        
          s 
         
        
          θ 
         
        
          = 
         
         
          
           
           
             x 
            
           
             1 
            
           
           
           
             x 
            
           
             2 
            
           
          
            + 
           
           
           
             y 
            
           
             1 
            
           
           
           
             y 
            
           
             2 
            
           
          
          
           
            
             
             
               x 
              
             
               1 
              
             
               2 
              
             
            
              + 
             
             
             
               y 
              
             
               1 
              
             
               2 
              
             
            
           
           
            
             
             
               x 
              
             
               2 
              
             
               2 
              
             
            
              + 
             
             
             
               y 
              
             
               2 
              
             
               2 
              
             
            
           
          
         
        
       
         cosθ=\frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}} 
        
       
     cosθ=x12+y12x22+y22x1x2+y1y2
 两个n维样本点 
     
      
       
       
         a 
        
       
         ( 
        
        
        
          x 
         
        
          11 
         
        
       
         , 
        
        
        
          x 
         
        
          12 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           1 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        a(x_{11},x_{12},...,x_{1n}) 
       
      
    a(x11,x12,...,x1n)与 
     
      
       
       
         b 
        
       
         ( 
        
        
        
          x 
         
        
          21 
         
        
       
         , 
        
        
        
          x 
         
        
          22 
         
        
       
         , 
        
       
         . 
        
       
         . 
        
       
         . 
        
       
         , 
        
        
        
          x 
         
         
         
           2 
          
         
           n 
          
         
        
       
         ) 
        
       
      
        b(x_{21},x_{22},...,x_{2n}) 
       
      
    b(x21,x22,...,x2n)的夹角余弦为:
  
      
       
        
        
          c 
         
        
          o 
         
        
          s 
         
        
          θ 
         
        
          = 
         
         
          
          
            a 
           
          
            ⋅ 
           
          
            b 
           
          
          
          
            ∣ 
           
          
            a 
           
          
            ∣ 
           
          
            ∣ 
           
          
            b 
           
          
            ∣ 
           
          
         
        
       
         cosθ=\frac{a \cdot b}{|a||b|} 
        
       
     cosθ=∣a∣∣b∣a⋅b
 即: 
      
       
        
        
          c 
         
        
          o 
         
        
          s 
         
        
          ( 
         
        
          θ 
         
        
          ) 
         
        
          = 
         
         
          
           
           
             ∑ 
            
            
            
              k 
             
            
              = 
             
            
              1 
             
            
           
             n 
            
           
           
           
             x 
            
            
            
              1 
             
            
              k 
             
            
           
           
           
             x 
            
            
            
              2 
             
            
              k 
             
            
           
          
          
           
            
             
             
               ∑ 
              
              
              
                k 
               
              
                = 
               
              
                1 
               
              
             
               n 
              
             
             
             
               x 
              
              
              
                1 
               
              
                k 
               
              
             
               2 
              
             
            
           
           
            
             
             
               ∑ 
              
              
              
                k 
               
              
                = 
               
              
                1 
               
              
             
               n 
              
             
             
             
               x 
              
              
              
                2 
               
              
                k 
               
              
             
               2 
              
             
            
           
          
         
        
       
         cos(θ)=\frac{\sum_{k=1}^nx_{1k}x_{2k}}{\sqrt{\sum_{k=1}^nx_{1k}^2}\sqrt{\sum_{k=1}^nx_{2k}^2}} 
        
       
     cos(θ)=∑k=1nx1k2∑k=1nx2k2∑k=1nx1kx2k
- 余弦距离也被称为余弦相似度,可以判断两个物品间的相关性,
比如3个人去超市买物品,用表格表示,买的为1,没有买的为0。 
| 物品人员 | a | b | c | d | e | 
|---|---|---|---|---|---|
| A | 1 | 1 | 0 | 0 | 1 | 
| B | 0 | 1 | 1 | 0 | 0 | 
| C | 1 | 0 | 0 | 0 | 1 | 
A与B的相似度: c o s ( θ ) = 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 0 1 2 + 1 2 + 0 2 + 0 2 + 1 2 0 2 + 1 2 + 1 2 + 0 2 + 0 2 = 1 6 = 0.408 cos(θ)=\frac{1*0+1*1+0*1+0*0+1*0}{\sqrt{1^2+1^2+0^2+0^2+1^2}\sqrt{0^2+1^2+1^2+0^2+0^2}}=\frac{1}{\sqrt{6}}=0.408 cos(θ)=12+12+02+02+1202+12+12+02+021∗0+1∗1+0∗1+0∗0+1∗0=61=0.408
A与C的相似度: c o s ( θ ) = 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 0 + 0 ∗ 0 + 1 ∗ 1 1 2 + 1 2 + 0 2 + 0 2 + 1 2 1 2 + 0 2 + 0 2 + 0 2 + 1 2 = 2 6 = 0.816 cos(θ)=\frac{1*1+1*0+0*0+0*0+1*1}{\sqrt{1^2+1^2+0^2+0^2+1^2}\sqrt{1^2+0^2+0^2+0^2+1^2}}=\frac{2}{\sqrt{6}}=0.816 cos(θ)=12+12+02+02+1212+02+02+02+121∗1+1∗0+0∗0+0∗0+1∗1=62=0.816
B与C的相似度: c o s ( θ ) = 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 0 + 0 ∗ 0 + 0 ∗ 1 0 2 + 1 2 + 1 2 + 0 2 + 0 2 1 2 + 0 2 + 0 2 + 0 2 + 1 2 = 0 4 = 0 cos(θ)=\frac{0*1+1*0+1*0+0*0+0*1}{\sqrt{0^2+1^2+1^2+0^2+0^2}\sqrt{1^2+0^2+0^2+0^2+1^2}}=\frac{0}{\sqrt{4}}=0 cos(θ)=02+12+12+02+0212+02+02+02+120∗1+1∗0+1∗0+0∗0+0∗1=40=0
由此可见,A与C的相似度较高,可以根据A用户购买的物品给与A相似度较高的C进行推荐。
KD树
有位置的数据想要去预测类别,找到跟他最临近的k个邻居,把这个点跟所有邻居的距离都算一下,进行排序,找到最近的k个来取众数,以此来划分到最多的类别中。对于数据比较少的情况,计算速度比较快,如果要训练好一个数据模型,数据量必然是很大的,再去一个一个的计算预测数据与每个邻居之间的距离,计算量就会特别的大,可以使用KD树进行优化。
KNN 的计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升 KNN 的搜索效率,提出了 KD 树(K-Dimensional 的缩写)。KD 树是对数据点在 K 维空间中划分的一种数据结构。在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。
- 例题1:有数据集{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造kd树。

六个数据点为二维的点,呈现在二维的坐标轴上,kd树的划分: 
- 1.以x1轴的中位数作为切分标准,2,4,5,7,8,9,把几个数从小到大排序,个数为偶数的话,选取中间的两个点,相加求中位数,(5+7)/2=6, 
  
- 1.(5,4)与(7,2)距离6同样近,取任意的一个点如取(7,2)作为根节点
 - 2.做一条过(7,2)点垂直于x1轴的线,把二维的屏幕划分为左右两部分
 
 - 2.以x2轴来划分左边区域,找到中位数,做x2的垂直线, 
  
- 1.左边区域有3个点,x2的值分别为3,4,7,中位数点为(5,4),
 - 2.过(5,4)做一条垂直于x2的线,把左边的区域分为上下两部分,
 - 3.以x1轴划分下区域,除了已成为节点的点,下区域就剩下了(2,3)点,通过(2,3)向x1做垂线,
 - 4.以x1轴划分上区域,除了已成为节点的点,上区域就剩下了(4,7)点,通过(4,7)向x1做垂线,
 - 5.在二叉树上放置的点是左小右大,所以把(2,3)点放在左侧,(4,7)点放在右侧
 
 - 3.以x2轴来划分右边区域,找到中位数,做x2的垂直线 
  
- 1.只剩下(8,1)与(9,6),所以中位数距离两个点的距离一致,随意取一个点作为节点,如取(9,6)
 - 2.过 (9,6)向x2轴做垂线,把右边区域也分为上下两部分,上部分已经没有点了
 - 3.下半部分找到(8,1)的中位数,只有一个点,这个点就是中位数,通过这个点向x1轴做垂线,得到的最后一个节点为(8,1)

 
 - 例题2,有目标点(3,4.5),请问如何在数据集中搜索目标点的最近邻?

如果取计算每个点的距离,就要去计算6次,如果数据量很大的话,计算量就会越来越多。用kd树进行计算,本身就是个递归,重复的过程。 
- 1.从根节点(7,2)来判断,点(3,4.5)x1轴上的数为3,3小于7,左边为较小的数,就找到了点(5,4),x2维度上的数为4,4.5大于4,会往右侧方向找(较大的数),找到了点(4,7),此时暂时的最近邻为(4,7),
 - 2.以(3,4.5)为圆心,到点(4,7)的距离为半径画圆,得到了蓝色的圆,很显然(4,7)不是点(3,4.5)的最近邻,此时算法要进行回溯,以目标点为圆心,以到暂时的临近点为半径,做圆,两点间的半径为2.69
 - 3.回溯到上个节点(5,4),以目标点为圆心,以到暂时的临近点(5,4)为半径,做圆,两点间的半径为2.06
 - 4.继续进行回溯到(2,3),以目标点为圆心,以到暂时的临近点(2,3)为半径,做圆,两点间的半径为1.8,
得到(2,3)才是最近邻的点,此时就不需要去计算距离(7,2),(9,6),(8,1)的距离了,减少了计算量。 
数据集获取
要测试一些算法,如果不是在真实的环境中,缺少特征工程的数据,学这些模型的时候就可以借鉴已经做好处理的数据来进行学习。
获取函数
获取数据的接口
sklearn.datasets 加载获取流行数据集
datasets.load_***() 获取小规模数据集,数据包含在datasets里
datasets.fetch_***(data_home=None) 获取大规模数据集,需要从网络上下载,
函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
 

返回集
load 和 fetch 返回的数据类型(字典格式)
data:特征数据数组
target:标签数组
DESCR:数据描述
feature_names:特征名
target_names:标签名
 

数据分割
训练模型需要一部分数据,评估模型的好坏需要一部分新的数据,两份数据重合的时候会产生状况,导致结果不真实,所以把数据分为训练集、测试集以及验证集,在没有调参之前把数据分为训练集和测试集。数据分割的方式:留出法,直接以二八或者三七分数据;K折交叉验证,把数据集分为10份,依次以1份作为测试集,其他的作为训练集,得出10次的结果求平均;自助法,训练集随机进行有放回的抽取。最常用的是留出法。
留出法api
用程序实现,把数据集分为3份和7份,用numpy、pandas的选择数据来做,求出数据的总长度,然后做切割,用sklearn来做训练集的测试分割。
sklearn.model_selection.train_test_split(arrays,*options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 训练特征值,测试特征值,训练目标值,测试目标值
 

 算法、模型都存在随机性,同一个算法、同一个数据集运行多次的时候结果是不一样的,同一个代码、同一个模型不同人训练出来的结果会有差异。数据分割同样也具有随机性,可以使用random_state参数,保证每次训练出来的结果是一样的。
 



















