KNN算法

1   KNN算法原理。

      存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。    输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。   

        示例:   如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

2  案例:

2.1 训练数据及标签

  k-近邻算法也可以像我们人一样做到这一点,不同的地方在于,我们的经验更”牛逼”,而k-邻近算法是靠已有的数据。比如,你告诉我这个电影打斗镜头数为2,接吻镜头数为102,我的经验会告诉你这个是爱情片,k-近邻算法也会告诉你这个是爱情片。

 注意:  knn只是基于历史数据,不会出现其他可能性!

2.2  预测 (101,20)属于什么类型的电影?

欧氏距离
欧氏距离

实际求 (101,20)所述的最近距离的K个点,判断这K个点中,最多的分类即为预测分类。

3 SKlearn  机器学习python库代码实现: 

3.1 SKlearn介绍
Scikit learn 也简称sklearn,是机器学习领域当中最知名的python模块之一。sklearn包含
了很多机器学习的方式:
Classification 分类
Regression 回归
Clustering 非监督分类
Dimensionality reduction 数据降维
Model Selection 模型选择
Preprocessing 数据与处理
使用sklearn可以很方便地让我们实现一个机器学习算法。一个复杂度算法的实现,使
用sklearn可能只需要调用几行API即可。所以学习sklearn,可以有效减少我们特定任务
的实现周期。

3.2 SKLearn Knn算法实现

#KNneighborsClassifier参数说明(共8个参数,不设置即为默认)
  # n_neighbors: 默认值5 ,  即KNN的k值,  选取最近的 k个点
  # weights: 默认uniform ,还有distance.    uniform就是所有邻近点的权重是相等的。  distance是不均等的, 距离近的点权重高。
 
  # algorithm: 快速K紧邻搜索算法,默认AUTO,即引擎自动决定合适的算法,也可以指定:
                # brute: 蛮力搜索,线性扫描,训练集大比较耗时
                # kd_tree:  以中值切分构造二叉树,每个节点是一个超矩阵,维数小于20效率高
                # ball_tree:客服 kd_tree高维失效而发明,以质心C和半径r分割样本空间,每个节点是一个超球体
 # leaf_size 默认30 ,构造kd ball树大小。影响构建速度和搜索速度,以及存储树所需内存大小

 # metric:用于距离度量,默认度量是minkowski,也就是p=2的欧氏距离(欧几里德度
量)。
# p:距离度量公式。在上小结,我们使用欧氏距离公式进行距离度量。除此之外,还
有其他的度量方法,例如曼哈顿距离。这个参数默认为2,也就是默认使用欧式距离
公式进行距离度量。也可以设置为1,使用曼哈顿距离公式进行距离度量。
#metric_params:距离公式的其他关键参数,这个可以不管,使用默认的None即可。
# n_jobs:并行处理设置。默认为1,临近点搜索并行工作数。如果为-1,那么CPU的
所有cores都用于并行工作

import numpy as p

from sklearn.neighbors import KNeighborsClassifier as kNN

def createDataSet():
    # 四组 二位特征 (动作次数,接吻次数)
    group = p.array([[1,101],[5,89],[108,5],[115,8]])
    print(type(group))
    t = [6,20]
    print(type(t))
    print(type([[6,20],].reshape(1,-1)))
    labels = ['爱情片','爱情片','动作片','动作片']
    return group,labels

if(__name__=='__main__'):
    group,labels = createDataSet()
    neigh = kNN(n_neighbors=3,algorithm='auto') #从近到远的样本,选取前三个, 看三个最近距离的样本中,所属类别最多的即为 预测分类
    neigh.fit(group,labels)  #拟合历史数据, KNN对训练数据什么都不做,只是加载到内存而已。
    classifierResult = neigh.predict([[6,20]])#预测
    print(classifierResult)   #结果:  ['爱情片']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值