|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 糖逗 于 2020-11-10 16:39 编辑
参考书籍:《机器学习实战》
- import numpy as np
- from numpy import random
- def loadDataSet(fileName):
- 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
- def selectJrand(i, m):
- j = i
- while(j == i):
- j = int(random.uniform(0, m))
- return j
- def clipAlpha(aj, H, L):
- if aj > H:
- aj = H
- if L > aj:
- aj = L
- return aj
- def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
- dataMatrix = np.mat(dataMatIn)
- labelMat = np.mat(classLabels).transpose()
- b = 0; m,n = np.shape(dataMatrix)
- alphas = np.mat(np.zeros((m,1)))
- iter = 0
- while (iter < maxIter):
- alphaPairsChanged = 0
- for i in range(m):
- fXi = float(np.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(np.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:
- L = max(0, alphas[j] + alphas[i] - C)
- H = min(C, alphas[j] + alphas[i])
- if L==H: print("L==H"); continue
- eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T
- if eta >= 0:
- print("eta>=0"); continue
- alphas[j] -= labelMat[j]*(Ei - Ej)/eta
- alphas[j] = clipAlpha(alphas[j],H,L)
- if (abs(alphas[j] - alphaJold) < 0.00001):
- print("j not moving enough"); continue
- alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])
- b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
- b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T
- if (0 < alphas[i]) and (C > alphas[i]):
- b = b1
- elif (0 < alphas[j]) and (C > alphas[j]):
- b = b2
- else:
- b = (b1 + b2)/2.0
- alphaPairsChanged += 1
- print("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged))
- if(alphaPairsChanged == 0):
- iter += 1
- else:
- iter = 0
- print("iteration number: %d" % iter)
- return b,alphas
- def calcWs(alphas,dataArr,classLabels):
- X = np.mat(dataArr); labelMat = np.mat(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
- dataArr, labelArr = loadDataSet(r"C:\...\testSet.txt")
- b, alphas = smoSimple(dataArr, labelArr, 0.6, 0.001, 40)
- ws = calcWs(alphas, dataArr, labelArr)
- import seaborn as sns
- import pandas as pd
- import matplotlib.pyplot as plt
- temp = pd.DataFrame(dataArr)
- temp.columns = ["1", "2"]
- temp["label"] = pd.array(labelArr)
- temp["label"] = np.array(temp["label"]).astype(np.int)
- xx = np.linspace(0, 10, 20)
- yy = (-b - xx * ws[0]) / ws[1]
- temp1 = pd.DataFrame()
- temp1["xx"] = np.array(xx)
- temp1["yy"] = np.array(yy.T)
- sns.scatterplot(data = temp, x = "1", y = "2", hue = "label")
- plt.plot(temp1['xx'], temp1['yy'])
-
复制代码 |
|