我有一个错误,说函数没有定义,但是有定义。我不知道为什么会这样。没有空格等。所有这3个def都已经用代码编写,但是python不能运行它们。你知道为什么吗。 请那些不知道如何回答,请不要张贴任何无关的答案,这个问题!谢谢您!你知道吗
import numpy as np
import cvxopt
import cvxopt.solvers
from numpy import linalg
def linear_kernel (x1,x2):
return np.dot(x1, x2)
def polynominal_kernel(x,y,p=3):
return(1+np.dot(x,y))**p
def gaussian_kernel(x, y, sigma=5.0):
return np.exp(-linalg.norm(x-y)**2 / (2*(sigma**2)))
class SVM(object):
def __init__(self, kernel=linear_kernel, C=None):
self.kernel=kernel
self.C=C
if self.C is not None: self.C = float(self.C)
def fit(self, X, y):
n_samples, n_features= X.shape
K=np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range (n_samples):
K[i,j]=self.kernel(X[i], X[j])
P=cvxopt.matrix(np.outer(y,y)*K)
q=cvxopt.matrix(np.ones(n_samples)*-1)
A=cvxopt.matrix(y, (1,n_samples))
b=cvxopt.matrix(0.0)
if self.C is None:
G=cvxopt.matrix(np.diag(np.ones(n_samples)*-1))
h=cvxopt.matrix(np.diag(np.zeros(n_samples)))
else:
tmp1= np.diag(np.ones(n_samples)*-1)
tmp2=np.identity(n_samples)
G=cvxopt.matrix(np.vstack((tmp1,tmp2)))
solution=cvxopt.solvers.qp(P,q,G,h,A,b)
a=np.ravel(solution['x'])
sv=a>1e-5
ind=np.arange(len(a)) [sv]
self.a =a[sv]
self.sv=X[sv]
self.sv_y=y[sv]
print("%d support vectors out of %d points" %(len(self.a), n_samples))
self.b=0
for n in range(len(self.a)):
self.b +=self.sv_y[n]
self.b -=np.sum(self.a*self.sv_y*K[ind[n],sv])
self.b /=len(self.a)
if self.kernel==linear_kernel:
self.w=np.zeros(n_features)
for n in range (len(self.a)):
self.w +=self.a[n]*self.sv_y[n]*self.sv[n]
else:
self.w=None
def project(self,X):
if self.w is not None:
return np.dot(X,self.w)+self.b
else:
y_predict=np.zeros(len(X))
for i in range(len(X)):
s=0
for a, sv_y, sv in zip(self.a, self.sv_y, self.sv):
s +=a*sv_y*self.kernel(X[i], sv)
y_predict[i]=s
return y_predict+self.b
def predict (self,X):
return np.sign(self.project(X))
if __name__=="main":
import pylab as pl
def gen_lin_separable_data():
mean1 =np.array([0,2])
mean2=np.array([2,0])
cov=np.array([[0.8, 0.6], [0.6, 0.8]])
X1=np.random.multivariate_normal(mean1, cov, 100)
y1=np.ones(len(X1))
X2=np.random.multivariate_normal(mean2, cov, 100)
y2=np.ones(len(X2)) * -1
return X1, y1,X2, y2
def gen_non_lin_separable_data():
mean1=[-1,2]
mean2=[1,-1]
mean3=[4,-4]
mean4=[-4,4]
cov=[[1.0,0.8], [0.8,1.0]]
X1=np.random.multivariate_normal(mean1, cov, 50)
X1=np.vstack((X1, np.random.multivariate_normal(mean3, cov, 50)))
y1=np.ones(len(X1))
X2=np.random.multivariate_normal(mean2, cov, 50)
X2.vstack((X2,np.random.multivariate_normal(mean4, cov, 50)))
y2=np.ones(len(X2))*-1
return X1, y1, X2, y2
def gen_lin_separable_overlap_data():
mean1 = np.array([0,2])
mean2=np.array([2,0])
cov=np.array([1.5, 1.0], [1.0, 1.5])
X1=np.random.multivariate_normal(mean1, cov, 100)
y1=np.ones(len(X1))
X2=np.random.multivariate_normal(mean2, cov, 50)
X2.vstack((X2,np.random.multivariate_normal(mean4, cov, 100)))
y2=np.ones(len(X2))*-1
return X1, y1, X2, y2
def split_train(X1, y1, X2, y2):
X1_train=X1[90:]
y1_train=y1[:90]
X2_train=X2[:90]
y2_train=y2[:90]
X_train=np.vstack((X1_train, X2_train))
y_train=np.hstack((y1_train, y2_train))
return X_train, y_train
def split_test(X1, y1, X2, y2):
X1_test=X1[90:]
y1_test=y1[90:]
X2_test=X2[90:]
y2_test=y2[90:]
X_test=np.vstack((X1_test, X2_test))
y_test=np.hstack((y1_test, y2_test))
return X_test, y_test
def plot_margin(X1_train, X2_train, clf):
def f(x, w, b, c=0):
return (-w[0]*x-b+c)/w[1]
pl.plot(X1_train[:,0], X1_train[:,1], "ro")
pl.plot(X2_train[:,0], X2_train[:,1], "bo")
pl.scatter(clf.sv[:,0], clf.sv[:,1], s=100, c="g")
a0=-4; a1=f(a0, clf.w, clf.b)
b0=4;b1=f(bo, clf.w, clf.b)
pl.plot([a0, b0],[a1, b1], "k")
a0=-4; a1=f(a0, clf.w, clf.b,1)
b0=4;b1=f(bo, clf.w, clf.b,1)
pl.plot([a0, b0],[a1, b1], "k--")
a0=-4; a1=f(a0, clf.w, clf.b,-1)
b0=4;b1=f(bo, clf.w, clf.b,-1)
pl.plot([a0, b0],[a1, b1], "k--")
pl.axis("tight")
pl.show()
def plot_contour(X1_train, X2_train, clf):
pl.plot(X1_train[:,0], X1_train[:,1], "ro")
pl.plot(X2_train[:,0], X2_train[:,1], "bo")
pl.scatter(clf.sv[:,0], clf.sv[:,1], s=100, c="g")
X1, X2 = np.meshgrig(np.linspace(-6, 6, 50), np.linspace(-6,6,50))
X=np.array([[x1, x2] for x1, x2 in zip(np.ravel(X1), np.ravel(X2))])
Z=clf.project(X) .reshape(X1.shape)
pl.contour(X1, X2, Z, [0.0], colors='k', linewidths=1, origin='lower')
pl.contour(X1, X2, Z+1, [0.0], colors='grey', linewidths=1, origin='lower')
pl.contour(X1, X2, Z-1, [0.0], colors='grey', linewidths=1, origin='lower')
pl.axis("tight")
pl.show
def test_linear():
X1, y1, X2, y2=gen_lin_separable_data()
X_train, y_train=split_train(X1, y1, X2, y2)
X_test, y_test=split_test(X1, y1, X2, y2)
clf=SVM()
clf.fit(X_train, y_train)
y_predict=clf.predict(X_test)
correct=np.sum(y_predict==y_test)
print("%d out of %d predictions correct" % (correct, len(y_predict)))
plot_margin(X_train[y_train==1], X_train[y_train==-1], clf)
def test_non_linear():
X1, y1, X2, y2=gen_non_lin_separable_data()
X_train, y_train=split_train(X1, y1, X2, y2)
X_test, y_test=split_test(X1, y1, X2, y2)
clf=SVM(polynominal_kernel)
clf.fit(X_train, y_train)
y_predict=clf.predict(X_test)
correct=np.sum(y_predict==y_test)
print("%d out of %d predictions correct" % (correct, len(y_predict)))
plot_contour(X_train[y_train==1], X_train[y_train==-1], clf)
def test_soft():
X1, y1, X2, y2=gen_lin_separable_overlap_data()
X_train, y_train=split_train(X1, y1, X2, y2)
X_test, y_test=split_test(X1, y1, X2, y2)
clf=SVM(C=1000.1)
clf.fit(X_train, y_train)
y_predict=clf.predict(X_test)
correct=np.sum(y_predict==y_test)
print("%d out of %d predictions correct" % (correct, len(y_predict)))
plot_contour(X_train[y_train==1], X_train[y_train==-1], clf)
# test_linear()
# test_non_linear()
# test_soft()
test_soft()
我的错误是:
if __name__=="main":
,应该是if __name__=="__main__":
相关问题 更多 >
编程相关推荐