├── Least Squares Sup-port Vector Machine Classifiers.pdf ├── README.md ├── lssvm.py └── testSetRBF.txt /Least Squares Sup-port Vector Machine Classifiers.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shiluqiang/LSSVM_python_code/fd7992a37aba051f3f5e0ef8dd1f3a623f14ba1f/Least Squares Sup-port Vector Machine Classifiers.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LSSVM_python_code -------------------------------------------------------------------------------- /lssvm.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on Wed May 16 12:48:56 2018 4 | 5 | @author: lj 6 | """ 7 | 8 | from numpy import * 9 | 10 | def loadDataSet(filename): 11 | '''导入数据 12 | input: filename:文件名 13 | output:dataMat(list)样本特征 14 | labelMat(list)样本标签 15 | ''' 16 | dataMat = [] 17 | labelMat = [] 18 | fr = open(filename) 19 | for line in fr.readlines(): 20 | lineArr = line.strip().split('\t') 21 | dataMat.append([float(lineArr[0]),float(lineArr[1])]) 22 | labelMat.append(float(lineArr[2])) 23 | return dataMat,labelMat 24 | 25 | 26 | def kernelTrans(X,A,kTup): 27 | '''数据集中每一个数据向量与数据A的核函数值 28 | input: X--特征数据集 29 | A--输入向量 30 | kTup--核函数参量定义 31 | output: K--数据集中每一个数据向量与A的核函数值组成的矩阵 32 | ''' 33 | X = mat(X) 34 | m,n = shape(X) 35 | K = mat(zeros((m,1))) 36 | if kTup[0] == 'lin': 37 | K = X * A.T 38 | elif kTup[0] == 'rbf': 39 | for j in range(m): 40 | deltaRow = X[j,:] - A 41 | K[j] = deltaRow * deltaRow.T 42 | K = exp(K/(-1 * kTup[1] ** 2)) 43 | else: raise NameError('Houston We Have a Problem -- That Kernel is not recognized') 44 | return K 45 | 46 | class optStruct: 47 | def __init__(self,dataMatIn,classLabels,C,kTup): 48 | self.X = dataMatIn 49 | self.labelMat = classLabels 50 | self.C = C 51 | self.m = shape(dataMatIn)[0] 52 | self.alphas = mat(zeros((self.m,1))) 53 | self.b = 0 54 | self.K = mat(zeros((self.m,self.m))) #特征数据集合中向量两两核函数值组成的矩阵,[i,j]表示第i个向量与第j个向量的核函数值 55 | for i in range(self.m): 56 | self.K[:,i] = kernelTrans(self.X, self.X[i,:], kTup) 57 | 58 | 59 | def leastSquares(dataMatIn,classLabels,C,kTup): 60 | '''最小二乘法求解alpha序列 61 | input:dataMatIn(list):特征数据集 62 | classLabels(list):分类标签集 63 | C(float):参数,(松弛变量,允许有些数据点可以处于分隔面的错误一侧) 64 | kTup(string): 核函数类型和参数选择 65 | output:b(float):w.T*x+b=y中的b 66 | alphas(mat):alphas序列 67 | ''' 68 | oS = optStruct(mat(dataMatIn),mat(classLabels).transpose(),C,kTup) 69 | ##1.参数设置 70 | unit = mat(ones((oS.m,1))) #[1,1,...,1].T 71 | I = eye(oS.m) 72 | zero = mat(zeros((1,1))) 73 | upmat = hstack((zero,unit.T)) 74 | downmat = hstack((unit,oS.K + I/float(C))) 75 | ##2.方程求解 76 | completemat = vstack((upmat,downmat)) #lssvm中求解方程的左边矩阵 77 | rightmat = vstack((zero,oS.labelMat)) # lssvm中求解方程的右边矩阵 78 | b_alpha = completemat.I * rightmat 79 | oS.b = b_alpha[0,0] 80 | for i in range(oS.m): 81 | oS.alphas[i,0] = b_alpha[i+1,0] 82 | return oS.alphas,oS.b,oS.K 83 | 84 | def predict(alphas,b,dataMat,testVec): 85 | '''预测结果 86 | input:alphas(mat):Lagrange乘子序列 87 | b(float):分隔超平面的偏置 88 | dataMat() 89 | 90 | output:sign(float(predict_value))(int):预测样本的类别 91 | ''' 92 | Kx = kernelTrans(dataMat,testVec,kTup) #可以对alphas进行稀疏处理找到更准确的值 93 | predict_value = Kx.T * alphas + b 94 | # print('预测值为:%f'%predict_value) 95 | # print('分类结果为:%f'%sign(float(predict_value))) 96 | return sign(float(predict_value)) 97 | 98 | 99 | 100 | 101 | if __name__ == '__main__': 102 | ##1.导入数据 103 | print('-----------------------------1.Load Data-------------------------------') 104 | dataMat,labelMat = loadDataSet('testSetRBF.txt') 105 | C = 0.6 106 | k1 = 0.3 107 | kernel = 'rbf' 108 | kTup = (kernel,k1) 109 | ##2.训练模型 110 | print('----------------------------2.Train Model------------------------------') 111 | alphas,b,K = leastSquares(dataMat,labelMat,C,kTup) 112 | ##3.计算训练误差 113 | print('----------------------------3.Calculate Train Error--------------------') 114 | error = 0.0 115 | for i in range(len(dataMat)): 116 | test = predict(alphas,b,dataMat,dataMat[i]) 117 | if test != float(labelMat[i]): 118 | error +=1.0 119 | errorRate = error/len(dataMat) 120 | print('---------------训练误差为:%f-------------------'%errorRate) 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /testSetRBF.txt: -------------------------------------------------------------------------------- 1 | -0.214824 0.662756 -1.000000 2 | -0.061569 -0.091875 1.000000 3 | 0.406933 0.648055 -1.000000 4 | 0.223650 0.130142 1.000000 5 | 0.231317 0.766906 -1.000000 6 | -0.748800 -0.531637 -1.000000 7 | -0.557789 0.375797 -1.000000 8 | 0.207123 -0.019463 1.000000 9 | 0.286462 0.719470 -1.000000 10 | 0.195300 -0.179039 1.000000 11 | -0.152696 -0.153030 1.000000 12 | 0.384471 0.653336 -1.000000 13 | -0.117280 -0.153217 1.000000 14 | -0.238076 0.000583 1.000000 15 | -0.413576 0.145681 1.000000 16 | 0.490767 -0.680029 -1.000000 17 | 0.199894 -0.199381 1.000000 18 | -0.356048 0.537960 -1.000000 19 | -0.392868 -0.125261 1.000000 20 | 0.353588 -0.070617 1.000000 21 | 0.020984 0.925720 -1.000000 22 | -0.475167 -0.346247 -1.000000 23 | 0.074952 0.042783 1.000000 24 | 0.394164 -0.058217 1.000000 25 | 0.663418 0.436525 -1.000000 26 | 0.402158 0.577744 -1.000000 27 | -0.449349 -0.038074 1.000000 28 | 0.619080 -0.088188 -1.000000 29 | 0.268066 -0.071621 1.000000 30 | -0.015165 0.359326 1.000000 31 | 0.539368 -0.374972 -1.000000 32 | -0.319153 0.629673 -1.000000 33 | 0.694424 0.641180 -1.000000 34 | 0.079522 0.193198 1.000000 35 | 0.253289 -0.285861 1.000000 36 | -0.035558 -0.010086 1.000000 37 | -0.403483 0.474466 -1.000000 38 | -0.034312 0.995685 -1.000000 39 | -0.590657 0.438051 -1.000000 40 | -0.098871 -0.023953 1.000000 41 | -0.250001 0.141621 1.000000 42 | -0.012998 0.525985 -1.000000 43 | 0.153738 0.491531 -1.000000 44 | 0.388215 -0.656567 -1.000000 45 | 0.049008 0.013499 1.000000 46 | 0.068286 0.392741 1.000000 47 | 0.747800 -0.066630 -1.000000 48 | 0.004621 -0.042932 1.000000 49 | -0.701600 0.190983 -1.000000 50 | 0.055413 -0.024380 1.000000 51 | 0.035398 -0.333682 1.000000 52 | 0.211795 0.024689 1.000000 53 | -0.045677 0.172907 1.000000 54 | 0.595222 0.209570 -1.000000 55 | 0.229465 0.250409 1.000000 56 | -0.089293 0.068198 1.000000 57 | 0.384300 -0.176570 1.000000 58 | 0.834912 -0.110321 -1.000000 59 | -0.307768 0.503038 -1.000000 60 | -0.777063 -0.348066 -1.000000 61 | 0.017390 0.152441 1.000000 62 | -0.293382 -0.139778 1.000000 63 | -0.203272 0.286855 1.000000 64 | 0.957812 -0.152444 -1.000000 65 | 0.004609 -0.070617 1.000000 66 | -0.755431 0.096711 -1.000000 67 | -0.526487 0.547282 -1.000000 68 | -0.246873 0.833713 -1.000000 69 | 0.185639 -0.066162 1.000000 70 | 0.851934 0.456603 -1.000000 71 | -0.827912 0.117122 -1.000000 72 | 0.233512 -0.106274 1.000000 73 | 0.583671 -0.709033 -1.000000 74 | -0.487023 0.625140 -1.000000 75 | -0.448939 0.176725 1.000000 76 | 0.155907 -0.166371 1.000000 77 | 0.334204 0.381237 -1.000000 78 | 0.081536 -0.106212 1.000000 79 | 0.227222 0.527437 -1.000000 80 | 0.759290 0.330720 -1.000000 81 | 0.204177 -0.023516 1.000000 82 | 0.577939 0.403784 -1.000000 83 | -0.568534 0.442948 -1.000000 84 | -0.011520 0.021165 1.000000 85 | 0.875720 0.422476 -1.000000 86 | 0.297885 -0.632874 -1.000000 87 | -0.015821 0.031226 1.000000 88 | 0.541359 -0.205969 -1.000000 89 | -0.689946 -0.508674 -1.000000 90 | -0.343049 0.841653 -1.000000 91 | 0.523902 -0.436156 -1.000000 92 | 0.249281 -0.711840 -1.000000 93 | 0.193449 0.574598 -1.000000 94 | -0.257542 -0.753885 -1.000000 95 | -0.021605 0.158080 1.000000 96 | 0.601559 -0.727041 -1.000000 97 | -0.791603 0.095651 -1.000000 98 | -0.908298 -0.053376 -1.000000 99 | 0.122020 0.850966 -1.000000 100 | -0.725568 -0.292022 -1.000000 101 | --------------------------------------------------------------------------------