机器学习基础算法---K近邻

机器学习基础算法—K近邻

机器学习

1.机器学习概述

概述:机器学习能让我们从数据中获得启发,换句话说,我们会利用计算机来彰显数据背后的真实含义,这是机器学习的真实含义。简单的说,机器学习就是把无序的数据转换为有用的信息。

2.机器学习的主要任务:分类和回归

监督学习:这类算法必须知道预测什么,即目标变量的分类信息

(1)分类:主要任务就是将实例数据划分到合适的分类中。
(2)回归:主要用于预测数值型数据,比如常见的数据拟合曲线:通过给定数据点的最优拟合曲线。
分类和回归都属于监督学习

无监督学习:数据没有类别信息,也不给定目标值

(1)聚类:在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;
(2)密度估计:将寻找描述数据统计值的过程称为密度估计。

下表中列出了机器学习的主要任务,以及解决相应问题的算法
在这里插入图片描述

3.选择合适的算法

上表中处理一个问题的算法有四种,如何从上表中列出的算法中选择实际可用的算法,必须要考虑下面两个问题:

**1)使用机器学习算法的目的,想要算法完成何种任务 **

如果想要预测目标变量的值,可以选择监督学习算法,否则选择无监督学习算法。确定监督学习算法之后,需要进一步确定目标变量类型:

a. 如果目标变量是离散型,如是/否、1/2/3或者红/黑,则可以选择分类器算法
b. 如果目标变量是连续型的数值,如0.01~1000、 -999-999,则需要选择回归算法

如果不想预测目标变量的值,则可以选择无监督学习算法,进一步分许是否需要将数据划分为离散的组:

a. 需要将数据划分为离散的组,则使用聚类算法
b. 如果还需要估计数据于每个分组的相似程度,则使用密度估计算法

在大多数情况下,以上给出的方法能帮助研究员选择恰当的机器学习算法,但这也并非一成不变。

2)需要分析或收集的数据是什么

我们还要充分了解数据,对实际数据了解的越充分,越容易创建符合实际需求的应用程序。
主要了解数据的以下特性:特征值是离散变量还是连续性变量,特征值中是否存在缺失的值,何种原因造成缺失值,是否存在异常值,某个特征发生的频率如何等等

我们只能在一定程度上缩小算法的选择范围,一般不存在最好的算法或者可以给出最好结构的算法,同时还要尝试不同算法的执行效果。

4.机器学习应用程序步骤

(1)收集数据
(2)准备输入数据(转换数据格式。。。)
(3)分析输入数据(如信任数据来源,可以跳过此步)
(4)训练算法(我们将前两步得到的格式化数据输入到算法,从中抽取知识或信息。如果使用无监督学习,由于不存在目标变量值,故而也不需要训练算法)
(5)测试算法(将实际使用第4步机器学习的到的知识信息)
注:为了评估算法,必须测试算法工作的效果。对于监督学习,必须已知用于评估算法的目标变量值;对于无监督学习,也必须用其他的评测手段来检验算法的成功率。
(6)使用算法(将机器学习算法转换为应用程序)

第4步和第5步是机器算法的核心

K-近邻算法

1.K-近邻算法思想

简单来说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。

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

优点:精度高、对异常值不敏感
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型

2.代码实现

算法代码实现思路如下:
在这里插入图片描述
1、数据集和标签

dataSet1 = array([[0, 10], [1, 8], [10, 1], [7, 4]])
labels = ['言情', '言情', '玄幻', '玄幻']

在这里插入图片描述
2.创建KNN函数

def knn(inX, dataSet, labels, k): # inX是用于分类的输入向量,dataSet输入的训练样本集
    dataSetSize = dataSet.shape[0]  # 计算样本数据的行数 --->4
    # print(dataSetSize)

    # 计算样本数据和X数据的差值
    # a = tile([6, 2], (4, 1))
    # >> > a
    # array([[6, 2],
    #        [6, 2],
    #        [6, 2],
    #        [6, 2]])
    # >> > dataSet1 = array([[0, 10], [1, 8], [10, 1], [7, 4]])
    # >> > a = tile([6, 2], (4, 1)) - dataSet1
    # >> > a
    # array([[6, -8],
    #        [5, -6],
    #        [-4, 1],
    #        [-1, -2]])

    diff = tile(inX, (dataSetSize, 1)) - dataSet  # diff = tile([6,2],(4,1)) 将[6,2]调整为4行1列
    # print(diff)

    sqrDiff = diff ** 2  # 差值的平方
    # >> > b = a ** 2
    # >> > b
    # array([[36, 64],
    #        [25, 36],
    #        [16, 1],
    #        [1, 4]], dtype=int32)

    sqrDiffSum = sqrDiff.sum(axis=1)  # 计算差值的平方和
    # >> > c = b.sum(axis=1)
    # >> > c
    # array([100, 61, 17, 5], dtype=int32)

    distances = sqrDiffSum ** 0.5  # 计算距离,两点之间计算距离
    # >> > d = c ** 0.5
    # >> > d
    # array([10., 7.81024968, 4.12310563, 2.23606798])

    sortDistance = distances.argsort() # 从小到大排序
    # >> > e = d.argsort()
    # >> > e
    # array([3, 2, 1, 0], dtype=int64)

    count = {}  # {'玄幻': 2, '言情': 1}

    for i in range(k):
        vote = labels[sortDistance[i]]
        count[vote] = count.get(vote, 0) + 1

    # 对所得距离从低到高进行排序
    sortCount = sorted(count.items(), key=operator.itemgetter(1), reverse=True)
    # 对类别出现的频数从高到低进行排序

    return sortCount[0][0]  # 返回出现频数最高的类别

3.测试KNN

inX = [6,2]
X = knn(inX,dataSet1,labels,3)
print(X)

最后输出结果
在这里插入图片描述

决策树算法

1.决策树算法思想

决策树的思想跟这个游戏思想类似,参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答,问问题的人通过推断分解,逐步缩小待猜测事物的范围。

上面介绍的K-近邻算法可以完成很多分类任务,但是它最大的缺点时无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。
在这里插入图片描述
在这里插入图片描述
决策树详细算法可以参考下面这个链接,博主讲的很好:https://blog.csdn.net/jiaoyangwm/article/details/79525237

原文链接:https://blog.csdn.net/jiaoyangwm/article/details/79525237

原文链接:https://blog.csdn.net/shirakami00/article/details/120519518

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值