1. 程式人生 > >支援向量機—SMO演算法原始碼分析(1)

支援向量機—SMO演算法原始碼分析(1)

支援向量機的理論支援在此不細說,可以參考李航的《統計學習》,還有西瓜書。

簡化版SMO演算法處理小規模資料集

SMO演算法是一種啟發式演算法。此簡化版首先在資料集上遍歷每一個alpha,然後在剩下的alpha集合中隨機選擇另一個alpha,從而建立alpha對。

# -*- coding: utf-8 -*-
from numpy import *
from time import sleep


# SMO演算法的輔助函式
def loadDataSet(fileName):  #載入並預處理資料集
    dataMat = []; labelMat = []
    fr = open(fileName,'r'
) for line in fr.readlines(): lineArr = line.strip().split('\t') # 以製表符分割 dataMat.append([float(lineArr[0]), float(lineArr[1])]) #提取前兩個元素存入data.Mat中 labelMat.append(float(lineArr[2])) # [].append(),最終的形式是矩陣 return dataMat,labelMat def selectJrand(i,m): # 該輔助函式用於在某個區間範圍內隨機選擇一個整數
j=i # m是所有alpha的數目,i是第一個alpha的下標 while (j==i): j = int(random.uniform(0,m)) # random.uniform(0,m)用於生成指定範圍內的隨機浮點數 return j def clipAlpha(aj,H,L): # 該輔助函式用於在數值太大時對其進行調整 if aj > H: aj = H if L > aj: aj = L return aj # 簡化版SMO演算法 def
smoSimple(dataMatIn, classLabels, C, toler, maxIter):
# 引數:資料集,類別標籤,常數c,容錯率,迴圈次數 dataMatrix = mat(dataMatIn) # mat()轉換成矩陣型別 labelMat = mat(classLabels).transpose() #轉置之前是列表,轉置後是一個列向量 b = 0; m,n = shape(dataMatrix) # 得到行,列數,m行,n列 alphas = mat(zeros((m,1))) # zeros(shape, dtype=float, order='C'),所以也可以寫作zeros((10,1),) iter = 0 # 該變數儲存的是在沒有任何alpha改變時遍歷資料集的次數 while (iter < maxIter): # 限制迴圈迭代次數,也就是在資料集上遍歷maxIter次,且不再發生任何alpha修改,則迴圈停止 alphaPairsChanged = 0 # 每次迴圈時先設為0,然後再對整個集合順序遍歷,該變數用於記錄alpha是否已經進行優化 for i in range(m): # 遍歷每行資料向量,m行 # 該公式是分離超平面,我們預測值 fXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b #print 'fxi:',fxi Ei = fXi - float(labelMat[i]) # 預測值和真實輸出之差 # 如果誤差很大就對該資料對應的alpha進行優化,正負間隔都會被測試,同時檢查alpha值 if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): j = selectJrand(i,m) # 隨機選擇不等於i的0-m的第二個alpha值 fXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b Ej = fXj - float(labelMat[j]) alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy(); if (labelMat[i] != labelMat[j]): # 這裡是對SMO最優化問題的子問題的約束條件的分析 L = max(0, alphas[j] - alphas[i]) # L和H分別是alpha所在的對角線端點的界 H = min(C, C + alphas[j] - alphas[i])

相關推薦

支援向量SMO演算法原始碼分析1

支援向量機的理論支援在此不細說,可以參考李航的《統計學習》,還有西瓜書。 簡化版SMO演算法處理小規模資料集 SMO演算法是一種啟發式演算法。此簡化版首先在資料集上遍歷每一個alpha,然後在剩下的alpha集合中隨機選擇另一個alpha,從而建立alpha

支援向量SMO演算法實現原始碼逐條解釋

支援向量機號稱機器學習中最好的演算法——存在最優解,而且一般問題都可以得解。但是演算法需要的儲存空間和計算複雜度較大,不大適合大資料量的運算,不過經過platt發明的SMO簡化運算後,效率可以提高很多。以下是筆者用Matlab語言寫的支援向量機兩分類問題的原始碼,因為在網路

支援向量SMO論文詳解序列最小最優化演算法

SVM的學習演算法可以歸結為凸二次規劃問題。這樣的凸二次規劃問題具有全域性最優解,並且許多最優化演算法可以用來求解,但是當訓練樣本容量很大時,這些演算法往往變得非常低效,以致無法使用。論文《Sequential Minimal Optimization:A Fast Algori

一步步教你輕鬆學支援向量SVM演算法之理論篇1

摘要:支援向量機即SVM(Support Vector Machine) ,是一種監督學習演算法,屬於分類的範疇。首先,支援向量機不是一種機器,而是一種機器學習演算法。在資料探勘的應用中,與無監督學習的聚類相對應和區別。廣泛應用於機器學習,計算機視覺和資料探勘當中。(本文原創,轉載必須註明出處.)

Mahout協同過濾演算法原始碼分析3--parallelALS

Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit。接上篇,此篇分析parallelALS的initializeM函式和for迴圈(for迴圈裡面含有一個QR分解,此篇只分析到這裡為止)。parallelALS的原始碼對應為:org.

支援向量數學證明與推導SVM

支援向量機(SVM) @(資料探勘)[svm] 一、線性可分支援向量機和硬間隔最大化 名詞解釋 線性可分:就是指給定一組資料集T={(x1,y1),(x2,y2),⋯,(x

SIFT特徵點演算法原始碼分析opencv

SIFT特徵點演算法原始碼分析 SIFT演算法在opencv中被實現為一個類: SIFT ,主要的操作都在這個類過載的"()"運算子中實現。下面介紹這個類,以及其中呼叫的一些關鍵的函式。 SIFT類的建構函式:初始化演算法引數 SIFT::SIFT(int nfeatu

SVM支援向量-SKlearn實現與繪圖8

瞭解了SVM的基本形式與演算法實現,接下來用SKlearn實現支援向量機分類器.1.函式定義與引數含義先看一下SVM函式的完全形式和各引數含義:SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto’, coef0=0.0, shrink

TensorFlow學習筆記之原始碼分析1----最近演算法nearest_neighbor

import numpy as np import tensorflow as tf # Import MINST data import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot

多執行緒高併發程式設計(12) -- 阻塞演算法實現ArrayBlockingQueue原始碼分析1

一.前言   前文探究了非阻塞演算法的實現ConcurrentLinkedQueue安全佇列,也說明了阻塞演算法實現的兩種方式,使用一把鎖(出隊和入隊同一把鎖ArrayBlockingQueue)和兩把鎖(出隊和入隊各一把鎖LinkedBlockingQueue)來實現,今天來探究下ArrayBlocking

Mybatis原始碼分析1—— Mapper檔案解析

感覺CSDN對markdown的支援不夠友好,總是伴隨各種問題,很惱火! xxMapper.xml的解析主要由XMLMapperBuilder類完成,parse方法來完成解析: public void parse() { if (!configuration.isRes

比特幣BTC原始碼分析1:地址生成過程

一、生成一個比特幣錢地址 二、根據原始碼整理比特幣地址生成過程 1、取得公鑰PubKey 2、使用 RIPEMD160(SHA256(PubKey)) 雜湊演算法,取公鑰並對其雜湊兩次 3、給雜湊加上地址生成演算法版本的字首 4、對於第二步生成的結果,使用SHA256(SHA256

以太坊ETH原始碼分析1:地址生成過程

一、生成一個以太坊錢包地址 通過以太坊命令列客戶端geth可以很簡單的獲得一個以太坊地址,如下: ~/go/src/github.com/ethereum/go-ethereum/build/bin$geth account new INFO [11-03|20:09:33.219]

jdk原始碼分析1java.lang.Object

java.lang.Object原始碼分析 public final native Class<?> getClass() public native int hashCode(); public boolean e

tensorflow原始碼分析1

variable類:        通過例項化Variable類可以新增一個變數到graph,在使用變數之前必須對變數顯示的初始化,初始化可以使用assign為變數賦值也可以通過變數本身的initializer方法。     &nb

ES5.6.2原始碼分析1:準備工作

1、gradle安裝 下載4.5版本,解壓後配置環境變數即可。 注:gradle安裝完成後, 為了加快依賴檔案的下載需要在使用者目錄中新建init.gradle檔案(讓全域性可見,build時會用到)。檔案的具體內容為: 目錄:C:\Users\admin.gradle

tensorflowV1.11-原始碼分析1

##</Users/deepmyhaspl/docs/tensorflow-src/tensorflow-r1.11>####[4]|<====configure.py=====>|## # Copyright 2017 The TensorFlow Authors. All

Django rest framework原始碼分析1----認證

目錄 一、基礎 1.1.安裝 兩種方式: pip install djangorestframework 1.2.需要先了解的一些知識 理解下面兩個知識點非常重要,django-rest-framework原始碼中到處都是基於CBV和麵向物件的封裝 (1)面向物件封裝的兩大特性

Android6.0的Looper原始碼分析1

Android在Java標準執行緒模型的基礎上,提供了訊息驅動機制,用於多執行緒之間的通訊。而其具體實現就是Looper。 Android Looper的實現主要包括了3個概念:Message,MessageQueue,Handler,Looper。其中Message就是

libevent原始碼分析1

有過看nginx原始碼的基礎,現在來看libevent原始碼,感覺要輕鬆多了。。 第一篇文章,主要是還是介紹一些幾個重要的資料結構吧。。。。 首先是event結構:struct event { TAILQ_ENTRY (event) ev_next; //用於構成eve