svm的**是實現原理
1)計算核函式
def calckernelvalue(matrix_x, sample_x, kerneloption):
kerneltype = kerneloption[0]
numsamples = matrix_x.shape[0]
kernelvalue = mat(zeros((numsamples, 1)))
if kerneltype == 'linear':
kernelvalue = matrix_x * sample_x.t
elif kerneltype == 'rbf':
sigma = kerneloption[1]
if sigma == 0:
sigma = 1.0
for i in range(numsamples):
diff = matrix_x[i, :] - sample_x
kernelvalue[i] = exp(diff * diff.t / (-2.0 * sigma ** 2))
else:
raise nameerror('not support kernel type! you can use linear or rbf!')
return kernelvalue
2)選擇最大迭代次數aj
第一步:選擇aj
def selectalpha_j(svm, alpha_i, error_i):
svm.errorcache[alpha_i] = [1, error_i] # mark as valid(has been optimized)
candidatealphalist = nonzero(svm.errorcache[:, 0].a)[0] # mat.a return array
maxstep = 0;
alpha_j = 0;
error_j = 0
# find the alpha with max iterative step
if len(candidatealphalist) > 1:
for alpha_k in candidatealphalist:
if alpha_k == alpha_i:
continue
error_k = mysvm.calcerror(svm, alpha_k)
if abs(error_k - error_i) > maxstep:
maxstep = abs(error_k - error_i)
alpha_j = alpha_k
error_j = error_k
# if came in this loop first time, we select alpha j randomly
else:
alpha_j = alpha_i
while alpha_j == alpha_i:
alpha_j = int(random.uniform(0, svm.numsamples))
error_j = mysvm.calcerror(svm, alpha_j)
return alpha_j, error_j
第二步:計算上下界
alpha_j, error_j = mysvm.selectalpha_j(svm, alpha_i, error_i)
alpha_i_old = svm.alphas[alpha_i].copy()
alpha_j_old = svm.alphas[alpha_j].copy()
eta = 2.0 * svm.kernelmat[alpha_i, alpha_j] - svm.kernelmat[alpha_i, alpha_i]
- svm.kernelmat[alpha_j, alpha_j]
if eta >= 0:
return 0
第四步:更新aj
svm.alphas[alpha_j] -= svm.train_y[alpha_j] * (error_i - error_j) / eta
第五步:確保aj在上下界範圍以內
if svm.alphas[alpha_j] > h:
svm.alphas[alpha_j] = h
if svm.alphas[alpha_j] < l:
svm.alphas[alpha_j] = l
第六步:根據更新後的aj更新ai
svm.alphas[alpha_i] += svm.train_y[alpha_i] * svm.train_y[alpha_j] \
* (alpha_j_old - svm.alphas[alpha_j])
第七步:更新閾值b
b1 = svm.b - error_i - svm.train_y[alpha_i] * (svm.alphas[alpha_i] - alpha_i_old) \
* svm.kernelmat[alpha_i, alpha_i] \
- svm.train_y[alpha_j] * (svm.alphas[alpha_j] - alpha_j_old) \
* svm.kernelmat[alpha_i, alpha_j]
b2 = svm.b - error_j - svm.train_y[alpha_i] * (svm.alphas[alpha_i] - alpha_i_old) \
* svm.kernelmat[alpha_i, alpha_j] \
- svm.train_y[alpha_j] * (svm.alphas[alpha_j] - alpha_j_old) \
* svm.kernelmat[alpha_j, alpha_j]
if (0 < svm.alphas[alpha_i]) and (svm.alphas[alpha_i] < svm.c):
svm.b = b1
elif (0 < svm.alphas[alpha_j]) and (svm.alphas[alpha_j] < svm.c):
svm.b = b2
else:
svm.b = (b1 + b2) / 2.0
SVM的分類原理
svm的主要思想可以概括為兩點 1 它是針對線性可分情況進行分析,對於線性不可分的情況,通過使用非線性對映演算法將低維輸入空間線性不可分的樣本轉化為高維特徵空間使其線性可分,從而使得高維特徵空間採用線性演算法對樣本的非線性特徵進行線性分析成為可能 2 它基於結構風險最小化理論之上在特徵空間中建構最優...
SVM的分類原理
svm的主要思想可以概括為兩點 1 它是針對線性可分情況進行分析,對於線性不可分的情況,通過使用非線性對映演算法將低維輸入空間線性不可分的樣本轉化為高維特徵空間使其線性可分,從而使得高維特徵空間採用線性演算法對樣本的非線性特徵進行線性分析成為可能 2 它基於結構風險最小化理論之上在特徵空間中建構最優...
SVM演算法原理
支援向量機 support vector machines 是乙個二分類的分類模型 或者叫做分類器 如圖 它分類的思想是,給定給乙個包含正例和反例的樣本集合,svm的目的是尋找乙個超平面來對樣本根據正例和反例進行分割。各種資料對它評價甚高,說 它在解決小樣本 非線性及高維模式識別中表現出許多特有的優...