日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习:SVM的最朴素代码实现,第一个变量遍历样本获得,第二个变量随机选择

發布時間:2024/9/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习:SVM的最朴素代码实现,第一个变量遍历样本获得,第二个变量随机选择 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • SVM的最樸素代碼實現:
  • 代碼實現:
  • 第一個變量遍歷樣本獲得,主要步驟如下:
  • 第二個變量隨機選擇:
  • 計算w:
  • 其他:

SVM的最樸素代碼實現:

算法簡單步驟:
1、遍歷樣本作為第一個變量a1,根據舊的a和b求得誤差,滿足KKT條件換下一個樣本;不滿足,
2、不滿足的話,隨機選取第二個變量a2(不能和第一個相同);
3、根據解析式求得a2;
4、根據解析式求a2的約束上界和下界;
5、根據4的約束求得新的a2;
6、根據解析式求得a1;
7、根據解析式求得b;
8、返回到第一步根據新得a和b求誤差

代碼實現:

第一個變量遍歷樣本獲得,主要步驟如下:

def smoSimple(dataMatIn, classLabels, C, toler, maxIter):"""簡化版SMO算法:param dataMatIn: X:param classLabels: Y:param C: 懲罰參數:param toler: 容錯率:param maxIter: 最大循環次數:return:"""dataMatrix = np.array(dataMatIn)# 備注針對行向量轉化為列向量需要添加[]labelMat = np.array([classLabels]).Tb = 0m,n = np.shape(dataMatrix) # m:=訓練實例的個數;n:=每個實例的維度alphas = np.zeros((m,1),dtype=float)# 迭代次數iter = 0while (iter < maxIter):alphaPairsChanged = 0 #alpha是否已經進行了優化# 遍歷樣本點for i in range(m):# 在初始的alpha下計算每一個樣本點的預測值# w = alpha * y * x; f(x_i) = w^T * x_i + bw_ = np.dot(np.multiply(alphas,labelMat).T,dataMatrix)fXi = np.dot(w_, dataMatrix[i,:].T) + b # fXi = float(np.multiply(alphas,labelMat).T*dataMatrix*dataMatrix[i,:].T) + b # 計算預測值和實際值的誤差Ei = fXi - float(labelMat[i]) #得到誤差,如果誤差太大,檢查是否可能被優化 # y[i]*g(x_i)-1 <0 and alphas[i] < C,這是違反KKT的情況# y[i]*g(x_i)-1 >0 and alphas[i] > 0,這個也是違反KKT的情況# 這里是簡化處理,沒有選擇最嚴重的樣本點,只要不滿足,就當第一個變量找到了if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): #必須滿足約束# 隨機選擇第二個樣本點作為變量j = selectJrand(i,m)# 計算第二個樣本的預測值fXj = np.dot(np.multiply(alphas,labelMat).T,np.dot(dataMatrix,dataMatrix[j,:].T)) + b # fXj = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b# 計算第二個樣本的誤差Ej = fXj - float(labelMat[j])# alpha_i,alpha_j的舊值,教材中的α_1^old和α_2^oldalphaIold = alphas[i].copy(); alphaJold = alphas[j].copy() # 因為存在約束,計算alpha_j的界if (labelMat[i] != labelMat[j]): # 兩者所在的對角線段端點的界L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])# 假如alpha_j的上界=下界,退出本次選擇,選擇下一個樣本點,# 因為alpha只有一個取值,假如alpha!=H就是無效的if L==H: print("L==H"); continue# 計算-dK# Eta = -(2 * K12 - K11 - K22),且Eta非負,此處eta = -Eta則非正eta = 2.0 * np.dot(dataMatrix[i,:],dataMatrix[j,:].T) - np.dot(dataMatrix[i,:],dataMatrix[i,:].T) - np.dot(dataMatrix[j,:],dataMatrix[j,:].T)if eta >= 0: print("eta>=0"); continue# 根據解析式求alpha_jalphas[j] -= labelMat[j]*(Ei - Ej)/eta# 根據約束條件求得滿足約束的alpha_2alphas[j] = clipAlpha(alphas[j],H,L)#如果內層循環通過以上方法選擇的α_2不能使目標函數有足夠的下降,那么放棄α_1if (abs(alphas[j] - alphaJold) < 0.00001): print("j not moving enough"); continue# 根據解析式結果計算α_1alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])# 根據解析式計算b,可以求出2個b,根據是否滿足KKT條件,如果兩者均0<a<C滿足KKT,b1 = b2# 如果a_1,a_2是0或者C,那么在b1,b2之間的b都是可行b,求他們均值就行了b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].Tb2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].Tif (0 < alphas[i]) and (C > alphas[i]): b = b1elif (0 < alphas[j]) and (C > alphas[j]): b = b2else: b = (b1 + b2)/2.0# 標記一下該樣本修改alphaPairsChanged += 1print("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))# 假如所有的樣本都遍歷了一遍,沒有不滿足kkt的樣本點,迭代次數加1if (alphaPairsChanged == 0): iter += 1# 只要一次迭代里面修改過alpha,就重復本次迭代else: iter = 0print("iteration number: %d" % iter)return b,alphas

第二個變量隨機選擇:

def selectJrand(i,m):"""隨機從0到m挑選一個不等于i的數:param i::param m::return:"""j=i #排除iwhile (j==i):j = int(np.random.uniform(0,m))return j

計算w:

w是非必須計算的,因為它就是alpha的組合而已。

def calcWs(alphas,dataArr,classLabels):"""根據支持向量計算分離超平面(w,b)的w參數:param alphas:拉格朗日乘子向量:param dataArr:數據集x:param classLabels:數據集y:return: w=∑alphas_i*y_i*x_i"""X = np.array(dataArr); labelMat = np.array([classLabels]).transpose()m,n = np.shape(X)w = np.zeros((n,1))for i in range(m):w += np.multiply(alphas[i]*labelMat[i],X[i,:].T)return w

其他:

def clipAlpha(aj,H,L):"""將aj剪裁到L(ow)和H(igh)之間:param aj::param H::param L::return:"""if aj > H:aj = Hif L > aj:aj = Lreturn ajdef loadDataSet(fileName):"""加載數據集:param fileName::return:"""dataMat = []; labelMat = []fr = open(fileName)for line in fr.readlines():lineArr = line.strip().split('\t')dataMat.append([float(lineArr[0]), float(lineArr[1])])labelMat.append(float(lineArr[2]))return dataMat,labelMat

總結

以上是生活随笔為你收集整理的机器学习:SVM的最朴素代码实现,第一个变量遍历样本获得,第二个变量随机选择的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇高潮一区二区三区69 | 中国黄色1级片 | 99久久婷婷 | 成人1区2区| 激情啪啪网 | 欧美人体视频一区二区三区 | 国产一区二区毛片 | 国产欧美综合在线 | 黄网站免费视频 | 成人h在线观看 | 国产色一区二区 | 春色影视 | 超碰97av| 久久白虎| 可以看的av网址 | 岛国精品视频 | 性少妇bbw张开 | 野花av| 国产又粗又长又硬免费视频 | 少妇熟女一区二区 | 亚洲三级免费观看 | 国产伊人自拍 | 中文字幕在线视频免费观看 | 久久成人视屏 | 日本一区二区三区精品 | 亚洲免费一二三区 | 日日爽视频 | 91麻豆产精品久久久久久 | 熟女视频一区二区三区 | 国产精品久久久久久99 | 一区精品二区国产 | 自偷自拍亚洲 | 男人手机天堂 | 久久精品免费av | 成人高清免费观看 | 亚洲不卡视频在线观看 | 亚洲国产精品自拍 | 国产真人做爰毛片视频直播 | 亚洲欧美日韩精品在线 | 国产高清一二三区 | 黄av资源 | 91午夜理伦私人影院 | 插插插日日日 | 欧美老肥妇做爰bbww | 欧美精品色婷婷五月综合 | 捆绑调教sm束缚网站 | 超碰人人插| 一卡二卡三卡在线视频 | 在线视频播放大全 | 激情片网站 | 亚洲综合视频在线 | 少妇性l交大片7724com | 欧美在线资源 | a√天堂在线 | 摸一摸操一操 | 成人精品一区二区三区四区 | 三级自拍| jizz日本在线观看 | 午夜伦情 | 女优中文字幕 | 女人的黄色片 | 色婷婷av一区二区三 | 男人添女人荫蒂国产 | 日本va欧美va精品发布 | 久久青青热 | 蜜臀99久久精品久久久久小说 | 农村寡妇一区二区三区 | 欧美三级三级三级爽爽爽 | 人妻换人妻a片爽麻豆 | 99久久精品一区二区三区 | 久久爱影视i | 久草国产在线观看 | 香蕉日日 | 亚洲天天干 | 日韩第一页 | 中文在线字幕免费观 | 88xx成人永久免费观看 | 成人午夜免费视频 | 午夜精品视频在线 | 国产精品人妻 | 德国老妇性猛交 | 国产精品高清网站 | 精品福利一区二区三区 | 大又大粗又爽又黄少妇毛片 | 亚洲在线免费 | 嫩草影院中文字幕 | 欧美午夜精品 | 国产尤物av | 成人免费在线视频网站 | 日日噜噜夜夜爽爽 | 女人18毛片一区二区三区 | 免费簧片在线观看 | 99蜜桃臀久久久欧美精品网站 | 成人免费观看视频大全 | 日本青草视频 | 亚洲av成人一区二区国产精品 | 免费黄色资源 | 色四月| 成人久久免费 |