From 765cc16c9165756d5f1f4f2b5f31efe7cf1e22a0 Mon Sep 17 00:00:00 2001 From: BlackTea-c <2286554510@qq.com> Date: Wed, 29 Nov 2023 17:58:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=BE=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eg1.py | 64 ------------------- eg_dual_form.py | 54 ---------------- ...13\345\272\217\344\273\243\347\240\201.py" | 53 +++++++++------ "\350\215\211\347\250\277.py" | 4 ++ 4 files changed, 36 insertions(+), 139 deletions(-) delete mode 100644 eg1.py delete mode 100644 eg_dual_form.py create mode 100644 "\350\215\211\347\250\277.py" diff --git a/eg1.py b/eg1.py deleted file mode 100644 index 02b088b..0000000 --- a/eg1.py +++ /dev/null @@ -1,64 +0,0 @@ -#求f(x)=sign(w*x+b) linear classifier -import time -import numpy as np -#数据点 -x=np.array([[3,3],[4,3],[1,1]]) -y=np.array([1,1,-1]) -#初始参数 -w=np.array([0,0]) -b=0 -#同n阶的矩阵乘法 -def muti_matrix(a,b): - result=0 - for i in range(len(a)): - result+=a[i]*b[i] - return result - -#判别模型 -def classifier_result(w,b,x): - if((muti_matrix(w,x)+b)>0): - return 1 - if ((muti_matrix(w,x)+b)<0): - return -1 - if ((muti_matrix(w,x)+b)==0): - return 0 - - -#损失函数 -def loss_function_L(w,b,x,y): - L=0 - record=[] #记录误分类点 - for i in range(len(x)): - #print(classifier_result(w,b,x[i])) - if(classifier_result(w,b,x[i])!=y[i]): - L+=-y[i]*(muti_matrix(w,x[i])+b) - record.append(i) - return L,record - - -#优化器 -#nata : 学习率 -def optimizer(nata,record): - #dl/dw 梯度 - Lw=[0,0] - #dl/b - Lb=0 - #if record !=[] - i=record[0] - Lw+=-y[i]*x[i] - Lb+=-y[i] - return nata*Lw,nata*Lb - - - -#主程序 -L,record=loss_function_L(w,b,x,y) -#print(L,record) -while(record!=[]): - w-=optimizer(1,record)[0] #梯度的反方向! - b-=optimizer(1,record)[1] - L,record=loss_function_L(w,b,x,y) - print(w,b,L) - #time.sleep(1.5) -print("results:",L," ",w," ",b) - diff --git a/eg_dual_form.py b/eg_dual_form.py deleted file mode 100644 index d6af560..0000000 --- a/eg_dual_form.py +++ /dev/null @@ -1,54 +0,0 @@ -#recall : perceptron ; f=sign(w*x+b) - -#loss function : -sum(M)(yi*(wx+b)) - -import numpy as np -#数据点 -x=np.array([[3,3],[4,3],[1,1]]) -y=np.array([1,1,-1]) -def muti_matrix(a,b): - result=0 - for i in range(len(a)): - result+=a[i]*b[i] - return result -def opti_target(i,a,b,Gram): #i为xi - sum=0 - for j in range(len(x)): - sum+=a[j]*y[j]*Gram[j][i] - return y[i]*(sum+b) - - - -#初始参数 -a=np.array([0,0,0]) -b=0 - -#计算Gram矩阵 -Gram=np.zeros((len(x),len(x))) -for i in range(len(x)): - for j in range(len(x)): - Gram[i][j]=muti_matrix(x[i],x[j]) - - - -sp=False #标记是否没有误分类数据 -nata=1 #learning rate -while(sp==False): - sp=True - for i in range(len(x)): - print(i,"opti:", opti_target(i, a, b, Gram)) - if(opti_target(i,a,b,Gram)<=0): - - a[i]=a[i]+nata - b=b+nata*y[i] - sp = False - print("a:",a,"b:",b) -print("result:",a,b) - - - - - - - - diff --git "a/\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\344\270\273\347\250\213\345\272\217\344\273\243\347\240\201.py" "b/\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\344\270\273\347\250\213\345\272\217\344\273\243\347\240\201.py" index c430fd5..1fdb202 100644 --- "a/\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\344\270\273\347\250\213\345\272\217\344\273\243\347\240\201.py" +++ "b/\346\224\257\346\214\201\345\220\221\351\207\217\346\234\272/\344\270\273\347\250\213\345\272\217\344\273\243\347\240\201.py" @@ -2,34 +2,34 @@ class SVM: - def __init__(self, max_iter=100, kernel='linear'): #设置最大迭代量,若超过max_iter仍不满足KKT条件则跳出; kernel即为核函数。 + def __init__(self, max_iter, kernel='linear'): #设置最大迭代量,若超过max_iter仍不满足KKT条件则跳出; kernel即为核函数。 self.max_iter = max_iter self._kernel = kernel - def init_args(self, features, labels): - self.m, self.n = features.shape + def init_args(self, features, labels): #features特征空间 labels变迁 + self.m, self.n = features.shape #m行 n列;n为特征数 m为样本量 self.X = features self.Y = labels self.b = 0.0 # 将Ei保存在一个列表里 - self.alpha = np.ones(self.m) + self.alpha = np.ones(self.m) #alpha_i 阿尔法初始化 self.E = [self._E(i) for i in range(self.m)] # 松弛变量 self.C = 1.0 - def _KKT(self, i): + def _KKT(self, i): #KKT条件的检验,这里没有在精度范围内进行检验呐 y_g = self._g(i) * self.Y[i] if self.alpha[i] == 0: return y_g >= 1 elif 0 < self.alpha[i] < self.C: - return y_g == 1 + return y_g == 1 #满足式子则return True 反之False else: return y_g <= 1 # g(x)预测值,输入xi(X[i]) def _g(self, i): - r = self.b + r = self.b #g(x)=sum(a_y*y_j*K(xi,xj)) + b for j in range(self.m): r += self.alpha[j] * self.Y[j] * self.kernel(self.X[i], self.X[j]) return r @@ -38,7 +38,7 @@ def _g(self, i): def kernel(self, x1, x2): if self._kernel == 'linear': return sum([x1[k] * x2[k] for k in range(self.n)]) - elif self._kernel == 'poly': + elif self._kernel == 'poly': #多项式和核函数 取p=2 return (sum([x1[k] * x2[k] for k in range(self.n)]) + 1)**2 return 0 @@ -47,18 +47,18 @@ def kernel(self, x1, x2): def _E(self, i): return self._g(i) - self.Y[i] - def _init_alpha(self): + def _init_alpha(self):#alpha的选择 # 外层循环首先遍历所有满足0= 0: j = min(range(self.m), key=lambda x: self.E[x]) @@ -66,7 +66,7 @@ def _init_alpha(self): j = max(range(self.m), key=lambda x: self.E[x]) return i, j - def _compare(self, _alpha, L, H): + def _compare(self, _alpha, L, H): # if _alpha > H: return H elif _alpha < L: @@ -74,14 +74,14 @@ def _compare(self, _alpha, L, H): else: return _alpha - def fit(self, features, labels): + def fit(self, features, labels): #Train self.init_args(features, labels) for t in range(self.max_iter): # train - i1, i2 = self._init_alpha() + i1, i2 = self._init_alpha() #得到选择的两个alpha - # 边界 + # 边界 L,H的确认: if self.Y[i1] == self.Y[i2]: L = max(0, self.alpha[i1] + self.alpha[i2] - self.C) H = min(self.C, self.alpha[i1] + self.alpha[i2]) @@ -91,12 +91,13 @@ def fit(self, features, labels): E1 = self.E[i1] E2 = self.E[i2] - # eta=K11+K22-2K12 + # eta=K11+K22-2K12 (书上的n) eta = self.kernel(self.X[i1], self.X[i1]) + self.kernel( self.X[i2], self.X[i2]) - 2 * self.kernel(self.X[i1], self.X[i2]) - if eta <= 0: - # print('eta <= 0') + print(eta) + if eta <= 0: #为什么这里会小于0????为什么小于0就不计算了? + #print(eta) continue alpha2_new_unc = self.alpha[i2] + self.Y[i2] * ( @@ -150,5 +151,15 @@ def score(self, X_test, y_test): def _weight(self): # linear model yx = self.Y.reshape(-1, 1) * self.X - self.w = np.dot(yx.T, self.alpha) - return self.w \ No newline at end of file + self.w = np.dot(yx.T, self.alpha) #np.dot矩阵乘法 + return self.w + + + +svm=SVM(max_iter=30) + +X_train=np.array([[1,2],[0,2],[1,1],[3,4],[2,3],[1,4],[-1,-1]]) +y_train=np.array([-1,-1,-1,1,1,1,-1]) +svm.fit(X_train, y_train) + +print(svm.score(X_train, y_train)) \ No newline at end of file diff --git "a/\350\215\211\347\250\277.py" "b/\350\215\211\347\250\277.py" new file mode 100644 index 0000000..adf5c6b --- /dev/null +++ "b/\350\215\211\347\250\277.py" @@ -0,0 +1,4 @@ + + + +print(1>2) \ No newline at end of file