-*-coding:utf-8 -*-
#匯入在實作支持向量機分類程序中所使用的模塊
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
#加載資料集,打開檔案并對其進行逐行讀取,將前兩列特征存盤到特征矩陣#dataMat中,將最后一列類別存盤到類別矩陣labelMat中,從而得到整個資料矩#陣和每行的類別標簽。
def loadDataSet(fileName):
dataMat = []
labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr = line.strip().split(',')
dataMat.append([float(lineArr[0]), float(lineArr[1])])
labelMat.append(float(lineArr[-1]))
return dataMat, labelMat
#隨機選擇第2個用于優化的引數alpha
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
#定義含有5個輸入引數的SMO函式,分別為資料集、類標簽、懲罰引數、允
#許錯誤率、最大迭代次數。
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
#創建alpha向量,其中所有元素都初始化為0,設定更新控制計數iter為0。
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
b = 0
m, n = shape(dataMatrix)
alphas = mat(zeros((m, 1)))
iter = 0
#外層回圈,iter小于maxIter時執行外層回圈,即當連續迭代maxIter次都沒有任何alpha值改變的情況下,才結束外層回圈。
while (iter < maxIter):
# alphaPairsChanged表示計數,用于記錄當前回圈中是否有alpha值發生改變,
#初如化為0,如果有alpha值發生變化則對該計數加1操作。
alphaPairsChanged = 0
#內層回圈,對資料集中的每個資料向量,如果該資料向量計算出來的誤差很大,#表明其對應的alpha值可以被優化,并隨機選擇另外一個資料向量,修改對應
#的alpha值對。
for i in range(m):
fXi=float(multiply(alphas, labelMat).T*(dataMatrix*dataMatrix[i,:].T))+b
Ei = fXi - float(labelMat[i])
if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i]>0)):
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()
if (labelMat[i] != labelMat[j]):
L = max(0, alphas[j] - alphas[i])
H = min(C, C+alphas[j]-alphas[i])
else:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131170.html
標籤:其他技術討論專區
上一篇:未來兩年學習開發語言
下一篇:機器學習學習方法
