机器学习第一周KNN k近邻分类

机器学习第一周:机器学习的敲门砖kNN算法

一、学习目标
  1. kNN算法的思想及其原理
  2. 使用python手动实现kNN算法,并在sklearn中调用
  3. 了解监督学习和非监督学习的概念

二、kNN算法的思想及其原理

​ KNN算法中文名称叫做K近邻算法。它是一个有监督的机器学习算法,其核心思想是未标记的样本的类别,由距离它最近的K个邻居投票来决定。

(1)有已经标记的数据,需要判断一个未标记的数据时,需要计算已标记的数与该未标记的数据点的距离,

(2)然后对距离排序;

(3)选择前面k个近点,根据各点表决的结果,选取表决结果最多的一种类别,作为其分类结果。

作用:既可以用作分类,也可以用来做回归。 对于数据没有假设,同时对异常点不敏感。

在这里插入图片描述

x,选择k个和它最近距离的点,根据其中某种分类最多点的那个分类即可该点的数据所属分类。kNN k-nearest Neighbor

借用居士的话:在一个给定的类别已知的训练样本集,已知样本集中每个数据与所属分类的对应关系(标签)。在输入不含标签的新样本后,将新的数据的每个特征与样本 集中数据对应的特征进行比较,然后算法提取样本最相似的k个数据(最近邻)的分类标签。通过多数表决等方式进行预测。即选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

**K近邻不具有显示的学习过程,而是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。**感觉居士所说的“找邻居+投票”

三:python 代码实现与sklearn调用

  1. python简单实现(分步实现):

    #(1)数据集
    #raw_data_x是特征,raw_data_y是标签,0为良性,1为恶性
    raw_data_x = [[3.393533211, 2.331273381],
                  [3.110073483, 1.781539638],
                  [1.343853454, 3.368312451],
                  [3.582294121, 4.679917921],
                  [2.280362211, 2.866990212],
                  [7.423436752, 4.685324231],
                  [5.745231231, 3.532131321],
                  [9.172112222, 2.511113104],
                  [7.927841231, 3.421455345],
                  [7.939831414, 0.791631213]
                 ]
    raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    
    #检测数据样本点
    x = [8.90933607318 , 3.365731514]
    
    
    #(2)数据可视化
    #设置训练组
    X_train = np.array(raw_data_x)
    Y_train = np.array(raw_data_y)
    
    #将数据可视化
    plt.scatter(X_train[Y_train == 0,0] ,X_train[Y_train == 0,1] , color='y', label = 'Tumor Size')
    plt.scatter(X_train[Y_train == 1,0] ,X_train[Y_train == 1,1] , color='r', label = 'Tumor Size')
    
    plt.xlabel('Tumor Size')
    plt.ylabel('Time')
    plt.axis([0,10,0,5])
    plt.show()
    

在这里插入图片描述

#(3)求距离
#求欧式距离
#for x_train  in X_train:
#    d = sqrt(np.sum(x_train-x)**2)
#    distances.append(d)

distances = [sqrt(np.sum((x_train - x) ** 2))  for  x_train in X_train]
print(distances)
#(4)按照从近到远排序
#使用numpy.argsort(array)对一个数组进行排序,返回的是相应的升序后结果的下标,即索引,该下标对应的是源数据中的下标
nearest = np.argsort(distances)
#(5)取前k个数据点对应的标签y
k = 6

print(nearest[:k]) #排序靠前k个的下标

#获得对应的分类标签

topKey = Y_train[nearest[:k]]

print(topKey)

#(6)找到近邻后进行投票,票数最多的那一类
votes = Counter(topKey)

print(votes)

#Counter.most_common(n),查找出票数最多的n个元素,返回的是一个列表,列表中的每个元素是一个元组,第一个是谁,第二个是数量
result = votes.most_common(1)
print(result)

predict_y = result[0][0]

print(predict_y)
#注 用到的模块
#coding=utf-8
import numpy  as  np
import  matplotlib.pyplot  as  plt
from  math  import  sqrt
from  collections  import Counter

  1. python封装类并调用

    #coding=utf-8
    
    import numpy as  np
    from  math  import  sqrt
    from collections  import  Counter
    
    class  KNNClassifier:
    
    
        def  __init__(self,k):
            """初始化分类器"""
            assert k >= 1, "k must be valid"
            self.k = k
            self.X_train = None
            self.Y_train = None
    
        def fit(self,X_train , Y_train):
            """根据训练数据集X_train 和Y_train训练KNN分类器"""
            assert X_train.shape[0] == Y_train.shape[0] , "the  size of  X_train must be equal to the size of Y_train"
            assert self.k <= X_train.shape[0] , "the size of X_train must be greater or equal to k"
            self.X_train = X_train
            self.Y_train = Y_train
            return  self
        def predict(self,X_predict):
            """给定待预测数据集X_predict,返回表示X_predict结果的向量"""
            assert self.X_train is not None and self.Y_train is not None," must fit before predict!"
            assert X_predict.shape[1] == self.X_train.shape[1],"the feature  number of X_predict must by equal to x_train"
            y_predict  = [self._predict(x) for x in X_predict]
            return np.array(y_predict)
    
        def _predict(self,x):
            distances = [sqrt(np.sum((x_train - x) ** 2)) for  x_train in self.X_train]
            nearest = np.argsort(distances)
            topKeyY = self.Y_train[nearest[:self.k]]
            votes = Counter(topKeyY)
            result = votes.most_common(1)
            return result[0][0]
    
        def __repr__(self):
            return  "KNN(k=%d)" % self.k
    
    
    #测试代码
    #coding=utf-8
    import numpy as  np
    
    #from  包名  import *   包名为文件名,*号可以为修改为其他具体内容
    from  kNNClassifier import KNNClassifier
    #raw_data_x是特征,raw_data_y是标签,0为良性,1为恶性
    raw_data_x = [[3.393533211, 2.331273381],
                  [3.110073483, 1.781539638],
                  [1.343853454, 3.368312451],
                  [3.582294121, 4.679917921],
                  [2.280362211, 2.866990212],
                  [7.423436752, 4.685324231],
                  [5.745231231, 3.532131321],
                  [9.172112222, 2.511113104],
                  [7.927841231, 3.421455345],
                  [7.939831414, 0.791631213]
                 ]
    raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    
    #检测数据样本点
    x = [8.90933607318 , 3.365731514]
    
    knnclass = KNNClassifier(k=6)
    knnclass.fit(X_train = np.array(raw_data_x),Y_train = np.array(raw_data_y))
    #多维数组的预测值,二维数组  reshape (由x转化为2维数组) 
    #[[1,2],[1,3]] 2个点
    predict_y = knnclass.predict(np.array(x).reshape(1,-1))   
    
    print(predict_y)
    
    

    KNNClassifier 类,主要有__init__ 方法,默认,fit训练模型,predict预测。因此一般的机器学习算法都会有fit / predict 两个方法。

    注:本文中代码均是来自木东居士微信公众号

  2. sklearn调用

    训练数据集—》机器学习算法 fit -->模型 输入样例 —>模型-predict ---->输出结果

    kNN算法没有模型,模型就是训练数据集,predict的过程就是求k近邻的过程。

    #coding=utf-8
    import numpy as  np
    from sklearn.neighbors import KNeighborsClassifier
    
    #raw_data_x是特征,raw_data_y是标签,0为良性,1为恶性
    raw_data_x = [[3.393533211, 2.331273381],
                  [3.110073483, 1.781539638],
                  [1.343853454, 3.368312451],
                  [3.582294121, 4.679917921],
                  [2.280362211, 2.866990212],
                  [7.423436752, 4.685324231],
                  [5.745231231, 3.532131321],
                  [9.172112222, 2.511113104],
                  [7.927841231, 3.421455345],
                  [7.939831414, 0.791631213]
                 ]
    raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
    
    #检测数据样本点
    x = [8.90933607318 , 3.365731514]
    
    
    #创建kNN_classifier 实例
    kNN_classifier = KNeighborsClassifier(n_neighbors=6)
    
    #kNN_classifier做一遍fit拟合的过程,没有返回值,模型就是存储在kNN_classifier实例中
    kNN_classifier.fit(np.array(raw_data_x),np.array(raw_data_y))
    
    #kNN进行预测predict,需要传入一个矩阵,而不能是一个数组。reshape()成一个二维数组,第一个参数1表示只有一个数据(1个点),第二个参数-1,numpy自动决定第二维度有多少
    y_predict  = kNN_classifier.predict(x.reshape(1,-1))
    
    print(y_predict)
    

    KNeighborsClassifier 是比较复杂的类,其中参数和方法需要再进一步研究。

四、监督学习与非监督学习概念

  1. 监督学习 supervised learning

    训练集中的目标是由人标注的。监督学习,通过已有的训练样本(即已知数据机器对应的输出)去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现目的。

    监督学习常见的有:回归分析和统计分类。

  2. 无监督学习 unsupervised learning

    无监督学习输入数据没有被标记,也没有明确的结果。样本数据类别未知,主要是让计算机自己去学习。

有监督学习方法必须要有训练集与测试样本。在训练集中找规律,并把规律用到预测中,添加标签。非监督学习没有训练集,只在一组数据总寻找规律。
注:对于numpy array 和 scatter 和orgsort 和 reshape 等Python中方法需要多多熟悉。

参考:

1.https://www.cnblogs.com/gemine/p/11130032.html

2.https://mp.weixin.qq.com/s?__biz=MzI4MjkzNTUxMw==&mid=2247483857&idx=1&sn=c888f2c4d40fb64eec5f5e78a3467b1a&chksm=eb932867dce4a171e5e9dba9f46a4e46127f063d1f9e817d250c5a5c18c1dd55f2acfa3c2662&token=2129819246&lang=zh_CN#rd 本文代码及绝大多数内容均来自此处:微信公众号 木东居士 数据科学家联盟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值