gpt4 book ai didi

python - SVM:训练后从头开始生成模型

转载 作者:行者123 更新时间:2023-11-30 09:48:33 29 4
gpt4 key购买 nike

训练后如何生成模型?我没有使用 sklearn 包来进行拟合和预测。我的代码如下所示:

class SVM(object):

def __init__(self, kernel=polynomial_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

# Gram matrix
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.zeros(n_samples))
else:
tmp1 = np.diag(np.ones(n_samples) * -1)
tmp2 = np.identity(n_samples)
G = cvxopt.matrix(np.vstack((tmp1, tmp2)))
tmp1 = np.zeros(n_samples)
tmp2 = np.ones(n_samples) * self.C
h = cvxopt.matrix(np.hstack((tmp1, tmp2)))

# solve QP problem
solution = cvxopt.solvers.qp(P, q, G, h, A, b)

# Lagrange multipliers
a = np.ravel(solution['x'])

# Support vectors have non zero lagrange multipliers
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))

# Intercept
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)


# Weight vector
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))

我尝试在我的测试文件中显示我的模型:

self.clf = SVM(C=1000.1)
self.svm_model=self.clf.fit(X, Y)
print(self.svm_model)

输出显示:

None

然后我尝试将模型保存在 Pickle 中:

    SVM_pkl_filename=QtGui.QFileDialog.getSaveFileName(self,'Save File')

print ("SVM classifier :: ", self.svm_model)

#SVM_pkl_filename = 'SVM_model.pkl'
SVM_model_pkl = open(SVM_pkl_filename, 'wb')
# Dump the trained SVM classifier with Pickle
pickle.dump(self.svm_model, SVM_model_pkl)

# Close the pickle instances
SVM_model_pkl.close()

我打开保存的文件,它什么也没显示。我将它与我用 Sklearn 保存的另一个模型文件进行了比较,它有一些随机内容。

我的模型的目的是使用 Pickle 保存和加载它。我使用 Pickle 来训练我的 4 个数据集,每次训练数据集时我的模型都会更新这些数据集。并加载模型进行测试。

最佳答案

问题出在这一行 - self.svm_model=self.clf.fit(X, Y)

请注意,您尝试将函数 fit() 的输出存储到 self.svm_model,但是 fit()函数不返回任何内容。

您必须为 fit 函数分配一个 return 语句,或者在 fit() 中就地分配 self.svm_model 对象> 功能。

此外,我对您希望 svm_model 拥有什么没有明确的看法。您想要保存权重还是想要一个拥有自己的 fit()predict() 方法(例如 scikit-learn)的便利对象>?

假设您只想保存权重,请将 fit() 函数更改为最后的 return self.w

pickle 不工作只是这个的结果。一旦解决了 svm_model 问题,酸洗应该会自行修复。

编辑

您的代码中还有另一个条件 -

else:
self.w = None

它返回None的另一个原因。如果不查看执行情况和数据,很难判断。

至于pickle之前的检查,您可以进行简单的空检查。

if not self.svm_model: # check not None
# pickle here

关于python - SVM:训练后从头开始生成模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49092695/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com