支援向量機—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原始碼分析(1)java.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