我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【数据科学系统学习】机器学习算法 #

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【数据科学系统学习】机器学习算法 #

本篇内容为《机器学习实战》第 6 章 支持向量机部分程序清单。所用代码为 python3。


支持向量机
优点:泛化错误率低,计算开销不大,结果易解释。
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二分类问题。
适用数据类型:数值型和标称型数据。

1996 年,John Platt 发布了一个称为SMO的强大算法,用于训练 SVMSMO表示序列最小优化 (Sequential Minimal Optimization)。

SMO算法的工作原理是:每次循环中选择两个alpha进行优化处理。一旦找到一对合适的alpha,那么就增大其中一个同时减小另一个。这里的“合适”是指两个alpha必须要符合一定的条件,第一个条件是这两个alpha必须要在间隔边界之外,第二个条件是这两个alpha还没有进行过区间化处理或者不在边界上。

下面给出简化版的SMO算法程序清单。

SMO函数的伪代码如下:
创建一个alpha向量并将其初始化为 0 向量
当迭代次数小于最大迭代次数时(外循环)
···对数据集中的每个数据向量(内循环):
······如果该数据向量可以被优化:
·········随机选择另外一个数据向量
·········同时优化这两个向量
·········如果两个向量都不能被优化,退出内循环
···如果所有向量都没被优化,增加迭代数目,继续下一次循环

程序清单 6-1 SMO算法中的辅助函数

# coding=utf-8
# import sys
from numpy import *

def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open('testSet.txt')

    for line in fr.readlines():
        lineArr = line.strip().split('\t')
        dataMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat, labelMat


# i 是第一个 alpha 的下标, m 是所有 alpha 的数目
# 只要函数值不等于输入值 i,函数就会进行随机选择
def selectJrand(i, m):
    j = i
    while (j == i):
        j = int(random.uniform(0, m))
    return j

# 用于调整大于 H 或小于 L 的 alpha 值
def clipAlpha(aj, H, L):
    if aj > H:
        aj = H
    if L > aj:
        aj = L
    return aj

在 python 提示符下,执行代码并得到结果:

>>> import svmMLiA
>>> dataArr, labelArr = svmMLiA.loadDataSet()
>>> labelArr
[-1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0]

可以看出,这里采用的类别标签是 -1 和 1。


程序清单 6-2 简化版SMO算法

# 参数:数据集,类别标签,常数C,容错率,退出前最大的循环次数
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
    dataMatrix = mat(dataMatIn)
    # 由于转置了类别标签,我们得到的是一个列向量而不是列表
    labelMat = mat(classLabels).transpose()
    b = 0
    m,n = shape(dataMatrix)
    # 构建一个 alpha 列矩阵,矩阵中元素都初始化为0
    alphas = mat(zeros((m, 1)))
    # iter 变量存储的是在没有任何 alpha 改变的情况下便利数据集的次数
    # 当这个变量达到输入值 maxIter 时,函数结束运行并退出
    iter = 0

    while(iter < maxIter):

        # 每次循环当中,将 alphaPairsChanged 先设为0,在对整个集合顺序遍历
        # 变量 alphaPairsChanged 用于记录 alpha 是否已经进行优化
        alphaPairsChanged = 0
        for i in range(m):
            # 计算 fXi,即我们预测的类别
            fXi = float(multiply(alphas, labelMat).T * (dataMatrix*dataMatrix[i,:].T) + b)
            # 与真实值比对,计算误差 Ei
            Ei = fXi - float(labelMat[i])
            # 如果误差很大,可以对该数据实例所对应的 alpha 值进行优化

            # 不论正间隔还是负间隔都会被测试
            # 检查 alpha 值,保证其不能等于 0 或 C
            if((labelMat[i]*Ei < -toler) and (alphas[i] < C)\
               or (labelMat[i]*Ei > toler) and (alphas[i] > 0)):

                # 用辅助函数 selectJrand 随机选择第二个 alpha 值,即 alpha[j]
                j = selectJrand(i,m)
                # 同样计算误差
                fXj = float(multiply(alphas, labelMat).T * (dataMatrix*dataMatrix[j,:].T)) + b
                Ej = fXj - float(labelMat[j])
                alphaIold = alphas[i].copy()
                alphaJold = alphas[j].copy()

                # 计算 L 和 H,调整 alpha 到 0 与 C 之间
                if(labelMat[i] != labelMat[j]):
                    L = max(0, alphas[j] - alphas[i])
                    H = min(C, C + alphas[j] - alphas[i])
                else:
                    L = max(0, alphas[j] + alphas[i] - C)
                    H = min(C, alphas[j] + alphas[i])
                if L==H:
                    print('L == H')
                    continue

                # eta 是 alpha[j] 的最优修改量
                eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - \
                    dataMatrix[i,:]*dataMatrix[i,:].T - \
                    dataMatrix[j,:]*dataMatrix[j,:].T

                if eta >= 0:
                    print('eta >= 0')
                    continue

                # 计算出一个新的 alpha[j],并进行调整
                alphas[j] -= labelMat[j] * (Ei - Ej) / eta
                alphas[j] = clipAlpha(alphas[j], H, L)

                # 检查 alpha[j] 是否有轻微改变,是的话则退出 for 循环
                if(abs(alphas[j] - alphaJold) < 0.00001):
                    print('j not moving enough')
                    continue

                # 对 alpha[i] 进行和 alpha[j] 同样的改变
                # 改变的大小一样,方向正好相反
                alphas[i] += labelMat[j] * labelMat[i] * (alphaJold - alphas[j])

                # 对 alpha[i] 和 alpha[j] 进行优化之后,给它们设置一个常数项 b
                b1 = b - Ei - \
                     labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - \
                     labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                b2 = b - Ej - \
                     labelMat[i] * (alphas[i] - alphaIold) * dataMatrix[i, :] * dataMatrix[j, :].T - \
                     labelMat[j] * (alphas[j] - alphaJold) * dataMatrix[j, :] * dataMatrix[j, :].T

        if(alphaPairsChanged == 0):
            iter += 1
        else:
            iter = 0
        print('iteration number: %d' % iter)
    return b, alphas

在 python 提示符下,执行代码并得到结果:

b, alphas = svmMLiA.smoSimple(dataArr, labelArr, 0.6, 0.001, 40)

再执行:

>>> for i in range(100):
...     if alphas[i] > 0.0:
...             print(dataArr[i], labelArr[i])
... 
[3.542485, 1.977398] -1.0
[7.108772, -0.986906] 1.0
[4.658191, 3.507396] -1.0
[7.40786, -0.121961] 1.0
[3.457096, -0.082216] -1.0
[5.286862, -2.358286] 1.0
[6.080573, 0.418886] 1.0
[6.543888, 0.433164] 1.0
[1.966279, -1.840439] -1.0

所输出的数据点即为支持向量。

注:以上给出的仅是简化版SMO算法的实现,关于完整的SMO算法加速优化并应用核函数,请参照《机器学习实战》第 99 页。


不足之处,欢迎指正。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【数据科学系统学习】机器学习算法 #

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【数据科学系统学习】机器学习算法 #

本篇内容为《机器学习实战》第 6 章 支持向量机部分程序清单。所用代码为 python3。支持向量机优点:泛化错误率低,计算开销不大,结果易解释。 缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二分类问题。适用数据类型:
2023-01-31

Python3.0科学计算学习之函数

函数函数允许程序的控制在不同的代码片段之间切换,函数的重要意义在于可以在程序中清晰地分离不同的任务,将复杂的问题分解为几个相对简单的子问题,并逐个解决。即“分而治之”。 Python的自建模块一般体现为函数。Python函数有如下特点:(1
2023-01-31

Python CPython 在机器学习和数据科学中的应用

Python CPython在机器学习和数据科学领域中脱颖而出,因为它提供了广泛的库、工具和社区支持,使其成为这些应用领域的理想选择。本文将探讨CPython在这些领域的关键应用及其使用方法。
Python CPython 在机器学习和数据科学中的应用
2024-03-04

Python科学计算学习之高级数组(二)

代码性能和向量化  背景:Python是一种解释型的编程语言,基本的python代码不需要任何中间编译过程来得到机器代码,而是直接执行。而对于C、C++等编译性语言就需要在执行代码前将其编译为机器指令。 但是,解释型代码的速度比编译型代码要
2023-01-31

人工智能深度学习与数据科学

编程学习网:如果您刚开始接触人工智能或数据科学,那么很有可能一遍又一遍地碰到这四个术语。在本文中,您将发现它们的基本含义,并了解它们之间的区别。
人工智能深度学习与数据科学
2024-04-23

PHP学习笔记:科学计算与数值模拟

引言:在当今科技大潮的推动下,科学计算和数值模拟在学术研究和工程实践中扮演着重要的角色。而作为一门功能强大的编程语言,PHP不仅可以用于网站开发和数据处理,也可以用于科学计算和数值模拟。本文将简要介绍PHP的科学计算和数值模拟基础,并提供具
2023-10-21

Python机器学习之AdaBoost算法

目录一、算法概述二、算法原理三、算法步骤四、算法实现五、算法优化一、算法概述AdaBoost 是英文 Adaptive Boosting(自适应增强)的缩写,由 Yoav Freund 和Robert Schapire 在1995年提出。A
2022-06-02

机器学习&数据科学&人工智能等的区别

欢迎各位阅读本篇,数据科学将会告诉你所需要了解的一切。它富有深刻见解,是根据哥伦比亚大学的数据科学的讲义整理而成。本篇文章讲述了机器学习&数据科学&人工智能等的区别,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
机器学习&数据科学&人工智能等的区别
2024-04-23

人工智能机器学习算法

编程学习网:根据一项调查,采用基于AI的解决方案的防欺诈专家中有80%认为AI对打击欺诈者有效。但是,仍然存在的问题是弄清楚哪种机器学习算法可以有效地检测未知的欺诈模式。监督学习和无监督学习算法哪一个更有效?
人工智能机器学习算法
2024-04-23

Python数据分析和机器学习如何学

今天就跟大家聊聊有关人工智能浪潮前,Python数据分析和机器学习如何学?,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如同互联网发展的浪潮,AI正在创造一个全新的世界。面对AI发展
2023-06-02

机器学习从科学项目到商业的计划

欢迎各位阅读本篇,本篇文章讲述了机器学习从科学项目到商业的计划,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
机器学习从科学项目到商业的计划
2024-04-23

学习如何使用numpy库进行数据分析和科学计算

随着信息时代的到来,数据分析和科学计算成为了越来越多领域的重要组成部分。在这个过程中,使用计算机进行数据处理和分析已经成为必不可少的工具。而在Python中,numpy库就是一个非常重要的工具,它可以让我们更加高效地进行数据处理和分析,更加
学习如何使用numpy库进行数据分析和科学计算
2024-01-19

Python机器学习之Kmeans基础算法

一、K-means基础算法简介 k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录