机器学习-K-近邻算法(K-Nearest Neighbors,简称 KNN)

机器学习:

        现有鸢尾花有三类分别是:山鸢尾、杂色鸢尾、维吉尼亚鸢尾,无法通过肉眼分辨,假如非植物学专家想要去分辨某一个鸢尾花是哪一种,就需要用到机器学习。

        机器学习一般思路(有监督学习):

        1、先由人工去采集鸢尾花,并测量每朵鸢尾花的各种性状,比如:花瓣长、花瓣宽、花萼长、花萼宽,然后由植物学专家认定每一朵鸢尾花类别,其中每一个类别分配一个值,比如山鸢尾=0、杂色鸢尾=1、维吉尼亚鸢尾=2。

        2、使用机器学习算法,比如:K近邻算法、朴素贝叶斯、决策树等训练得到模型(一个以鸢尾花性状为自变量鸢尾花类别为因变量的函数)

        3、将未知种类的鸢尾花性状特征输入函数得到类别结果

K近邻算法(knn):

        1、解释

        k:表示选择的“最近邻居”的数量(通常由用户指定,如K=3、5等)

        近邻:指在特征空间中距离目标样本最近的训练样本。

        2、示例

        已知鸢尾花如下:

名称花瓣长花瓣宽花萼长花萼宽结果
a53.61.40.20
b6.43.15.51.82
c5.93.05.11.82
d5.63.04.11.31
e5.43.41.70.20
f5.43.04.51.51
g6.73.15.62.42
h6.73.05.22.32
i5.72.94.21.31
g5.72.55.02.02
k6.73.14.41.41
l6.42.85.62.12
m7.23.05.81.62
n6.93.15.12.32
o5.03.51.60.60

        任取两种性状比如花瓣长、花瓣宽来训练模型,如下图所示:

        当有一个未知鸢尾花p其花瓣长为6.6,花瓣宽为2.8,在坐标系中表示为如上图所示p=(6.6,2.8),想要预测他的类别可以带入以上模型,由距离可以得到最邻近的五个点为(b,k,n,h,i),对应类别为(2,1,2,2,1),由于离鸢尾花p最近的五个点中2类别占多数,所以判断该鸢尾花p为类别2的鸢尾花。

         以上机器学习K近邻算法使用python实现如下:

import numpy as np
from collections import Counter
class MyKNeighborClassifier(object):
    #初始化
    def __init__(self,K_Neighbor):
        #赋值近邻数量
        self.k_neighbor = k_neighbor
    
    #训练
    def fit(self,X,y):
        #将样本特征与标签转化为numpy方便计算
        X = np.array(X)
        y = np.array(y)
        #判断参数是否正确
        if X.ndim!=2 or y.ndim!=1 of X.shape[0]!=y.shape[0]:
            raise ValueError("参数错误")
        #赋值给类属性
        self.X = X
        self.y = y
    #预测
    def predict(self,X):
        #将样本特征转化为numpy方便计算
        X = np.array(X)
        #判断参数是否正确
        if X.ndim!=2 or X.shape[1]!=self.X.shape[1]:
            raise ValueError("参数错误")
        #创建结果数组
        results=[]
        #循环待预测样本特征
        for x in X:
            #计算当前待测样本特征到所有训练样本特征的距离
            distance = ((self.X - x) ** 2).sum(axis=1)
            #获取k_neighbor个最小距离序号
            idxs = np.argsort(a=distance)[:self.k_neighbor]
            #获取k_neighbor个最小距离序号对应的标签
            lables = self.y[idxs]
            #计算最大概率标签
            lable = Counter(lables).most_common(1)[0][0]
            #将当前待测样本特征对应标签加入结果数组
            results.append(lable)
        #将结果数组转numpy数组后返回
        return np.array(results)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值