基本上相当于把课本内容又整理了一遍,当然有些地方理解的不够清楚,可能有错误,看到了请指正_。因为不太会markdown的语法,所以直接用word写了截的图,doc文件和代码在这里



















C = 1
threshold = 1e-8  # 确保选择的a2使得损失函数有足够的下降
eps = 1e-30# 参数顺序:K,b,alpha,y
def getL(K, alpha, y):  # 获取当前损失函数值l = 0for i in range(len(y)):for j in range(len(y)):l += 0.5 * alpha[i] * alpha[j] * y[i] * y[j] * K[i][j]l -= alpha[i]return ldef getGx(K, b, i, alpha, y):  # 获取预测值g = bfor j in range(len(y)):g += alpha[j] * y[j] * K[j][i]return g# 不要直接修改alpha,防止不满足目标函数阈值下降条件的情况出现
def getNewAlpha(K, b, i1, i2, alpha, y):eta = K[i1][i1] + K[i2][i2] - 2 * K[i1][i2]# ************# if eta < 1e-20:#     eta = 1e-20# ************a2_new_unc = alpha[i2] + y[i2] * ((getGx(K, b, i1, alpha, y) - y[i1]) - (getGx(K, b, i2, alpha, y) - y[i2])) / eta# 剪辑if y[i1] == y[i2]:L = max(0, alpha[i1] + alpha[i2] - C)H = min(C, alpha[i1] + alpha[i2])else:L = max(0, alpha[i2] - alpha[i1])H = min(C, C + alpha[i2] - alpha[i1])if a2_new_unc > H:a2_new = Helif a2_new_unc < L:a2_new = Lelse:a2_new = a2_new_unca1_new = alpha[i1] + y[i1] * y[i2] * (alpha[i2] - a2_new)# a1 = y[i1] * st - a2_new * y[i1] * y[i2]E1 = getGx(K, b, i1, alpha, y) - y[i1]E2 = getGx(K, b, i2, alpha, y) - y[i2]b1_new = -1 * E1 - y[i1] * K[i1][i1] * (a1_new - alpha[i1]) - y[i2] * K[i2][i1] * (a2_new - alpha[i2]) + bb2_new = -1 * E2 - y[i1] * K[i1][i2] * (a1_new - alpha[i1]) - y[i2] * K[i2][i2] * (a2_new - alpha[i2]) + bif (a1_new > 0 and a1_new < C) and (a2_new and a2_new < C):bnew = b1_newelse:bnew = (b1_new + b2_new) / 2return (a1_new, a2_new, bnew)def SMO(K, b, alpha, y):flag = Truewhile flag == True:# flag = false说明找不到可以优化的a1,a2flag = FalsepreL = getL(K, alpha, y)for i1 in range(len(alpha)):gxi1 = getGx(K, b, i1, alpha, y)if alpha[i1] > 0 and alpha[i1] < C and abs(y[i1] * gxi1 - 1) > eps:E1 = gxi1 - y[i1]maxDiff = 0  # |使得E1 - E2|最大posi2 = 0for i2 in range(len(alpha)):if i1 == i2:continueE2 = getGx(K, b, i2, alpha, y) - y[i2]if abs(E1 - E2) > maxDiff:maxDiff = abs(E1 - E2)posi2 = i2a1_new, a2_new, b_new = getNewAlpha(K, b, i1, posi2, alpha, y)# 更新alphaalpha[i1], a1_new = a1_new, alpha[i1]alpha[posi2], a2_new = a2_new, alpha[posi2]curL = getL(K, alpha, y)# 找到解,更新bif preL - curL >= threshold:b = b_newflag = Truebreak# 没有达到预定条件,那么搜索在0-C内的a2# if preL - curL < threshold:else:alpha[i1], a1_new = a1_new, alpha[i1]alpha[posi2], a2_new = a2_new, alpha[posi2]for i2 in range(len(alpha)):if i2 == i1 or i2 == posi2:continueif alpha[i2] > 0 and alpha[i2] < C:# i2写成了posi2a1_new, a2_new, b_new = getNewAlpha(K, b, i1, i2, alpha, y)alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]curL = getL(K, alpha, y)# 满足条件则停止if preL - curL >= threshold:b = b_newflag = Truebreakelse:alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]if flag:break# 如果还是不满足,就搜索全部的a2else:for i2 in range(len(alpha)):if i2 == i1 or i2 == posi2:continueif abs(alpha[i2] - 0) <= eps or abs(alpha[i2] - C) <= eps:a1_new, a2_new, b_new = getNewAlpha(K, b, i1, i2, alpha, y)alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]curL = getL(K, alpha, y)if preL - curL >= threshold:b = b_newflag = Truebreakelse:alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]if flag:breakif flag == False:for i1 in range(len(alpha)):gxi1 = getGx(K, b, i1, alpha, y)if ((alpha[i1] - 0) <= eps and y[i1] * gxi1 < 1) or ((alpha[i1] - C) < eps and y[i1] * gxi1 > 1):E1 = gxi1 - y[i1]maxDiff = 0  # |使得E1 - E2|最大posi2 = 0for i2 in range(len(alpha)):if i2 == i1:continueE2 = getGx(K, b, i2, alpha, y) - y[i2]if abs(E1 - E2) > maxDiff:maxDiff = abs(E1 - E2)posi2 = i2a1_new, a2_new, b_new = getNewAlpha(K, b, i1, posi2, alpha, y)# 更新alphaalpha[i1], a1_new = a1_new, alpha[i1]alpha[posi2], a2_new = a2_new, alpha[posi2]curL = getL(K, alpha, y)if preL - curL >= threshold:b = b_newflag = Truebreak# 没有达到预定条件,那么搜索在0-C内的a2# if preL - curL < threshold:else:alpha[i1], a1_new = a1_new, alpha[i1]alpha[posi2], a2_new = a2_new, alpha[posi2]for i2 in range(len(alpha)):if i2 == i1 or i2 == posi2:continueif alpha[i2] > 0 and alpha[i2] < C:a1_new, a2_new, b_new = getNewAlpha(K, b, i1, i2, alpha, y)alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]curL = getL(K, alpha, y)# 满足条件则停止if preL - curL >= threshold:b = b_newflag = Truebreakelse:alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]if flag:break# 如果还是不满足,就搜索全部的a2else:for i2 in range(len(alpha)):if i2 == i1 or i2 == posi2:continueif (alpha[i2] - 0) <= eps or (alpha[i2] - C) <= eps:a1_new, a2_new, b_new = getNewAlpha(K, b, i1, i2, alpha, y)alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]curL = getL(K, alpha, y)if preL - curL >= threshold:b = b_newflag = Truebreakelse:alpha[i1], a1_new = a1_new, alpha[i1]alpha[i2], a2_new = a2_new, alpha[i2]if flag:breakreturn alpha, bdef getK(X, f):K = [0] * len(X)for i in range(len(K)):K[i] = [0] * len(X)# print(len(K))# print(len(K[0]))for i in range(len(X)):for j in range(len(X)):for k in range(len(X[i])):K[i][j] += f(X[i][k]) * f(X[j][k])return K# X = [[3,3],[4,3],[1,1]]
# y = [1,1,-1]
# K = getK(X,lambda x:x)
# alpha = [0,0,0]
# b = 0
# alpha,b = SMO(K,b,alpha,y)
# print(alpha,b)import random
import numpy as np
import matplotlib.pyplot as pltdef kernelF(x, xi, f):Kx_xi = 0for i in range(len(x)):Kx_xi += f(x[i]) * f(xi[i])return Kx_xi#定义椭圆x^2 + 4y^2 = 4
# 圆圈是训练集数据,三角形是测试集数据,用颜色标记正负例
# theta = np.arange(0, 2.1 * np.pi ,0.1 * np.pi)
# plt.plot(2 * np.cos(theta),np.sin(theta),c='red')
#
# X = [[random.uniform(-2.5,2.5),random.uniform(-1.5,1.5)] for _ in range(50)]
# y = [0] * len(X)
# for i in range(len(X)):
#     if X[i][0] ** 2 + 4 * X[i][1] ** 2 <= 4:
#         y[i] = 1
#         plt.scatter(X[i][0],X[i][1],c='blue',marker='o')
#     else:
#         y[i] = -1
#         plt.scatter(X[i][0], X[i][1], c='green',marker='o')
#
# K = getK(X,lambda x:x ** 2)
# b = 0
# alpha = [0] * len(X)
# alpha,b = SMO(K,b,alpha,y)
#
# for i in range(50):
#     xi = [random.uniform(-2.5,2.5),random.uniform(-1.5,1.5)]
#     pred = b
#     for idx in range(len(alpha)):
#         pred += alpha[idx] * y[idx] * kernelF(xi,X[idx],lambda x:x ** 2)
#     if pred >= 0:
#         plt.scatter(xi[0], xi[1], c='blue', marker='^')
#     else:
#         plt.scatter(xi[0], xi[1], c='green', marker='^')
# plt.show()
# plt.axis('equal')# 定义直线x + y = 0
# 圆圈是训练集数据,三角形是测试集数据,用颜色标记正负例
x = np.arange(-5, 5, 1)
plt.plot(x, -1 * x, c='red')X = [[random.uniform(-5, 5), random.uniform(-5, 5)] for _ in range(20)]
y = [0] * len(X)
for i in range(len(X)):if X[i][0] + X[i][1] <= 0:y[i] = 1plt.scatter(X[i][0], X[i][1], c='blue', marker='o')else:y[i] = -1plt.scatter(X[i][0], X[i][1], c='green', marker='o')K = getK(X, lambda x: x)
b = 0
alpha = [0] * len(X)
alpha,b = SMO(K, b, alpha, y)for i in range(100):xi = [random.uniform(-5, 5), random.uniform(-5, 5)]pred = bfor idx in range(len(alpha)):pred += alpha[idx] * y[idx] * kernelF(xi, X[idx], lambda x: x)if pred >= 0:plt.scatter(xi[0], xi[1], c='blue', marker='^')else:plt.scatter(xi[0], xi[1], c='green', marker='^')
plt.show()
plt.axis('equal')

总结:这是第二遍看有监督学习部分,每次都有新收获吧。公式看着挺多,但是大部分仅仅是长和复杂而已,难度不高,当然确实也有几个地方比较难理解。。。

支持向量机详解及代码(SMO算法)相关推荐

  1. KMP算法详解及代码

    KMP算法详解及代码 KMP算法详解及代码 定义及应用 理论 基本概念 next 数组 总结 注意 代码 KMP算法详解及代码 最近正好在看字符串相关的算法内容,就顺便把KMP算法回顾了一下.相应的代 ...

  2. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  3. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  4. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  5. 数学建模——支持向量机模型详解Python代码

    数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...

  6. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  7. Go-AES算法详解与代码

    目录 AES 发展史 概述 轮函数F 字节代换 行移位 列混淆 轮密钥加 密钥编排 AES和DES的不同之处 分组模式CTR AES的Go实现 aes包 cipher包 加密/解密 参考 本篇介绍分组 ...

  8. 【分享实录】BANCOR算法详解及代码实现

    1 活动基本信息 1)主题:[区块链技术工坊22期]BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何 ...

  9. 技术工坊|BANCOR算法详解及代码实现(上海)

    2019独角兽企业重金招聘Python工程师标准>>> EOS项目在RAM分配中采用了Bancor算法,并将RAM的价格爆炒到了很高的价位,凭借EOS项目在区块链领域的强大运营宣传能 ...

最新文章

  1. mysql多列索引不全用,MySQL多列索引的生效规则
  2. Android IOS WebRTC 音视频开发总结(二三)-- hurtc使用说明
  3. apache配置,保你配置成功
  4. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...
  5. Android UI控件----ExpandableListView的基本用法
  6. Java动态代理代码案例:使用cglib实现对无接口的类进行动态代理
  7. 【c++算法刷题笔记】——洛谷2
  8. python中反向切片用法_使用Python中的切片[:0:-1]反转列表
  9. leetcood学习笔记-58-最后一个单词的长度
  10. ZMQ中线程之间发送命令
  11. wince 德赛西威2413_德赛西威NAV230凯立德2016春季专版C2134-C7M07-3921J0S
  12. 当AD(Altium Designer)画PCB时Ctrl+H快捷键无法选中连线时的解决办法
  13. 电线超负荷的危险与原因
  14. cookies、sessions、token区别
  15. 修改本机的 Host 文件
  16. 充满未知的在线招聘行业,前程无忧如何持续盈利
  17. PyGame “超级玛丽”游戏专题开篇——“变态超级玛丽”的诞生
  18. Could not find messages which '/home/flying/catkin_ws/src/beginner_tutorials/msg/Num.msg' depends
  19. win10 64位操作系统写注册表失败 VS C++
  20. 法瑞意游记+攻略 五(巴黎-苏黎世 TGV 十二月三十日) 未完

热门文章

  1. 算法 — 纸牌三角形
  2. 论文那些事—Towards Evaluating the Robustnessof Neural Networks
  3. 编写程序,计算斐波那契(Fibonacci)数列,输出前50项。该数列的前两项都是1,从第3项开始,其后的每一个数据项都是前面的两个数据项之和。
  4. 12V升压120V、100V、150V、200V、300V直流电源模块
  5. 拍拍贷管理层调整:李铁铮任副董事长 章峰任联席CEO
  6. LaTeX 使用Excel2LaTeX表格绘制注意事项
  7. 魔力Python——对象
  8. 开机启动卡在主板LOGO界面,并长时间提示检测中,最后启动失败
  9. Apple iOS MDM service 簡介
  10. windows下基于krpano的全自动化处理平台