Python图像处理(15):SVM分类器

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息


opencv中支持SVM分类器,本文尝试在python中调用它。


和前面的贝叶斯分类器一样,SVM也遵循先训练再使用的方式,我们直接在贝叶斯分类器的测试代码上做简单修改,完成两类数据点的分类。


首先也是先创建训练用的数据,需要注意的是这里的train_label必须是整数类型,而不是float


# 训练的点数
train_pts = 30

# 创建测试的数据点,2类
# 以(-1.5, -1.5)为中心
rand1 = np.ones((train_pts,2)) * (-2) + np.random.rand(train_pts, 2)
print('rand1:')
print(rand1)

# 以(1.5, 1.5)为中心
rand2 = np.ones((train_pts,2)) + np.random.rand(train_pts, 2)
print('rand2:')
print(rand2)

# 合并随机点,得到训练数据
train_data = np.vstack((rand1, rand2))
train_data = np.array(train_data, dtype='float32')
train_label = np.vstack( (np.zeros((train_pts,1), dtype='int32'), np.ones((train_pts,1), dtype='int32')))

# 显示训练数据
plt.figure(1)
plt.plot(rand1[:,0], rand1[:,1], 'o')
plt.plot(rand2[:,0], rand2[:,1], 'o')
plt.plot(rand2[:,0], rand2[:,1], 'o')

类似这样的数据:



在得到训练数据后,接着创建一个SVM分类器并配置训练参数:


# 创建分类器
svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)  # SVM类型
svm.setKernel(cv2.ml.SVM_LINEAR) # 使用线性核
svm.setC(1.0)

接着我们对此分类器进行训练:

# 训练
ret = svm.train(train_data, cv2.ml.ROW_SAMPLE, train_label)


在训练完成后就可以使用测试数据进行预测了:

# 测试数据,20个点[-2,2]
pt = np.array(np.random.rand(20,2) * 4 - 2, dtype='float32')
(ret, res) = svm.predict(pt)
print("res = ")
print(res)

predict通过res返回得到一个20x1的数组,每一行对应一个输入点,计算得到的值就是分类的序号,在这里是01,我们取0.5为阈值进行分类并显示结果:

# 按label进行分类显示
plt.figure(2)
res = np.hstack((res, res))

# 第一类
type_data = pt[res < 0.5]
type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))
plt.plot(type_data[:,0], type_data[:,1], 'o')

# 第二类
type_data = pt[res >= 0.5]
type_data = np.reshape(type_data, (type_data.shape[0] / 2, 2))
plt.plot(type_data[:,0], type_data[:,1], 'o')

plt.show()

看看最后的结果:




最后,通过svm. getSupportVectors获取支持向量。

# 支持向量
vec = svm.getSupportVectors()
print(vec)














  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,以下是Python代码示例,使用协同表示分类器对高光谱数据进行图像分类: ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score from sklearn.svm import SVC from scipy.linalg import pinv2 # 读取数据 data = np.loadtxt('data.txt', delimiter=',') # 分割数据集 X = data[:, :-1] y = data[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 特征缩放 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 协同表示分类器 class SRC(): def __init__(self, lamda=0.1): self.lamda = lamda def fit(self, X, y): self.X = X self.y = y def predict(self, X_test): y_pred = [] for i in range(X_test.shape[0]): x = X_test[i].reshape(-1, 1) A = self.X.T G = np.dot(A, A.T) + self.lamda*np.identity(A.shape[0]) w = np.dot(pinv2(G), A) c = np.dot(w, x) r = x - np.dot(A, c) residuals = np.sum(r**2, axis=0) idx = np.argmin(residuals) y_pred.append(self.y[idx]) return np.array(y_pred) # 训练分类器 clf = SRC() clf.fit(X_train, y_train) y_pred = clf.predict(X_test) # 测试准确率 acc = accuracy_score(y_test, y_pred) print('Accuracy:', acc) ``` 其中,`data.txt`是高光谱数据文件,每行为一个样本,最后一列为标签。代码中首先使用`train_test_split`函数将原始数据集分割为训练集和测试集,然后使用`StandardScaler`进行特征缩放。接着定义了一个协同表示分类器`SRC`,其中`fit`方法用于训练分类器,`predict`方法用于预测新的样本。在`predict`方法中,使用协同表示的思想,通过求解线性方程组得到系数向量,然后计算残差并选择最相似的训练样本作为预测结果。最后,使用`accuracy_score`函数计算预测准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值