线性SVM-1

import numpy as np
import pandas as pd
import sklearn.svm
import seaborn as sns
import scipy.io as sio
import matplotlib.pyplot as plt

 一.准备数据

mat = sio.loadmat('./data/ex6data1.mat')
print(mat.keys())

data = pd.DataFrame(mat.get('X'), columns=['X1', 'X2'])
data['y'] = mat.get('y')
data.head()

 

1. 使用scipy.io模块中的loadmat函数,从'./data/ex6data1.mat'路径加载MATLAB数据文件,并将其内容存储在mat变量中。

2. 打印出mat变量中所有键的列表。MATLAB数据文件通常包含多个变量,这些变量在Python中以字典的形式存储,其中键是MATLAB中的变量名,值是相应的数据

3. 从mat字典中提取键为'X'的数据(通常是一个二维数组或矩阵),然后使用Pandas的DataFrame构造函数将其转换为一个DataFrame对象。columns=['X1', 'X2']指定了DataFrame的列名。

4. 从mat字典中提取键为'y'的数据(通常是一个一维数组或向量),并将其添加为data DataFrame的一个新列,列名为'y'

5. 使用Pandas的head()方法显示data DataFrame的前五行。这是一个快速查看DataFrame前几行数据的常用方法。

综上所述,这段代码的主要目的是加载一个MATLAB数据文件,提取其中的某些数据,并将其转换为一个Pandas DataFrame,以便进行进一步的数据分析和处理。

min(data['X1']), max(data['X1']), min(data['X2']), max(data['X2'])
# (0.086405, 4.015, 1.6177, 4.6162)

 二. 画出图像

positive = data[data.y == 1]
negative = data[data.y == 0]

fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(positive['X1'], positive['X2'], label='positive', s=50, marker='+', c='r')
ax.scatter(negative['X1'], negative['X2'], label='negative', s=50, marker='o', c='b')
ax.legend(loc='best')
ax.set_xlabel('X1')
ax.set_ylabel('X2')
plt.show()

 

总之,这段代码的目的是通过散点图可视化data DataFrame中正样本和负样本的分布。正样本用红色的加号标记,负样本用蓝色的圆圈标记。

三.SVM try C=1(较小的值指定更强的正则化。正则化有助于防止过拟合。

svc1 = sklearn.svm.LinearSVC(C=1, loss='hinge', max_iter=20000)
svc1.fit(data[['X1', 'X2']], data['y'])
svc1.score(data[['X1', 'X2']], data['y'])
# 0.9803921568627451

总的来说,这段代码展示了如何使用scikit-learn中的LinearSVC来训练一个线性SVM分类器,并评估其在给定数据集上的准确度。

  1. svc1 = sklearn.svm.LinearSVC(C=1, loss='hinge', max_iter=20000)

    这行代码创建了一个LinearSVC对象,并将其赋值给变量svc1LinearSVCscikit-learn中实现线性SVM的类。这里设置了三个参数:

    • C=1: 正则化强度的倒数,较小的值指定更强的正则化。正则化有助于防止过拟合。
    • loss='hinge': 损失函数类型,'hinge'表示使用Hinge损失函数,这是SVM常用的损失函数。
    • max_iter=20000: 最大迭代次数。在某些情况下,优化算法可能需要很多迭代才能收敛,特别是在数据集很大或正则化强度很高时。
  2. svc1.fit(data[['X1', 'X2']], data['y'])

    这行代码使用fit方法来训练svc1分类器。它接受两个参数:

    • data[['X1', 'X2']]: 这是一个DataFrame,包含用于训练的数据特征,即X1X2两列。
    • data['y']: 这是一个Series,包含每个样本的标签(即目标变量)。

    fit方法会基于这些数据来训练分类器,找到最佳的决策边界。

  3. svc1.score(data[['X1', 'X2']], data['y'])

    这行代码使用score方法来评估svc1分类器在相同数据集上的性能。它返回分类器的准确度,即正确分类的样本数与总样本数之比。

    • data[['X1', 'X2']]: 同样是用于评估的特征数据。
    • data['y']: 是真实的标签数据,用于与分类器的预测结果进行比较。

    score方法会返回一个介于0和1之间的浮点数,表示分类器的准确度。值越接近1,表示分类器的性能越好。

四.画出决策边界

fig, ax = plt.subplots(figsize=(8, 6))
positive = data[data.y == 1]
negative = data[data.y == 0]

ax.scatter(positive['X1'], positive['X2'], label='positive', s=50, marker='+', c='r')
ax.scatter(negative['X1'], negative['X2'], label='negative', s=50, marker='o', c='b')
ax.legend(loc='best')
ax.set_xlabel('X1')
ax.set_ylabel('X2')

# 决策边界, 使用等高线表示
x1 = np.arange(0, 4.5, 0.01)
x2 = np.arange(0, 5, 0.01)
x1, x2 = np.meshgrid(x1, x2)
y_pred = np.array([svc1.predict(np.vstack((a, b)).T) for (a, b) in zip(x1, x2)])
plt.contour(x1, x2, y_pred, colors='g', linewidths=.5)

plt.show()

综上所述,这段代码的目的是在散点图上可视化SVM分类器对数据的分类结果,并通过等高线显示决策边界。这有助于直观地了解分类器如何将数据点分为两个不同的类别。

data['SVM1 Confidence'] = svc1.decision_function(data[['X1', 'X2']])

 综合来说,这段代码计算了数据集中每个样本点对于SVM分类器决策的置信度,并将这些置信度分数存储在一个新的列中。这可以帮助我们了解分类器对于每个样本点的分类有多大的信心。高置信度通常意味着分类器对于该样本点的分类非常确定,而低置信度可能表示分类器的决策不够确定,或者样本点可能位于决策边界附近。

fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(data['X1'], data['X2'], s=50, c=data['SVM1 Confidence'], cmap='seismic')
ax.set_title('SVM(C=1) Decision Confidence')
ax.set_xlabel('X1')
ax.set_ylabel('X2')

# 决策边界, 使用等高线表示
x1 = np.arange(0, 4.5, 0.01)
x2 = np.arange(0, 5, 0.01)
x1, x2 = np.meshgrid(x1, x2)
y_pred = np.array([svc1.predict(np.vstack((a, b)).T) for (a, b) in zip(x1, x2)])
plt.contour(x1, x2, y_pred, colors='g', linewidths=.5)

plt.show()

 

总的来说,这段代码的目的是创建一个散点图,其中每个点的颜色表示SVM分类器对该点的决策置信度(即点到决策边界的距离),并且在图上绘制出SVM的决策边界。这样可以帮助我们直观地了解分类器对每个样本点的决策有多大的信心,并且了解决策边界的位置。

五.tryC=400 

C对应正则化的λ,C=1/λ,C越大越容易过拟合。图像中最左侧的点被划分到右侧。

svc400 = sklearn.svm.LinearSVC(C=400, loss='hinge', max_iter=80000)
svc400.fit(data[['X1', 'X2']], data['y'])
svc400.score(data[['X1', 'X2']], data['y'])

# 1

 这段代码是使用scikit-learn库中的LinearSVC类来训练一个线性支持向量机(SVM)分类器,并评估其在给定数据上的性能(准确率)。

  1. svc400 = sklearn.svm.LinearSVC(C=400, loss='hinge', max_iter=80000)

    这行代码创建了一个LinearSVC对象,并设置了三个参数:

    • C=400C是SVM的正则化参数。它控制分类器对错误分类的惩罚程度。较大的C值意味着分类器会尽量减少错误分类的样本数,而较小的C值则允许更多的错误分类,以换取更简单的决策边界。
    • loss='hinge':这指定了损失函数的类型。对于线性SVM,通常使用hinge损失函数。
    • max_iter=80000:这设置了优化算法的最大迭代次数。对于某些数据集,默认的迭代次数可能不足以找到最优解,因此可以通过增加max_iter的值来提供更多的计算时间。
  2. svc400.fit(data[['X1', 'X2']], data['y'])

    这行代码使用fit方法来训练SVM分类器。data[['X1', 'X2']]是特征数据,data['y']是相应的标签(或目标值)。通过调用fit方法,分类器会学习如何根据特征数据来预测目标值。

  3. svc400.score(data[['X1', 'X2']], data['y'])

    这行代码使用score方法来评估训练好的SVM分类器在给定数据上的性能。score方法返回分类器的准确率,即正确分类的样本数与总样本数之比。这里,它使用相同的data[['X1', 'X2']]特征数据和data['y']标签数据来计算准确率。

fig, ax = plt.subplots(figsize=(8, 6))
positive = data[data.y == 1]
negative = data[data.y == 0]

ax.scatter(positive['X1'], positive['X2'], label='positive', s=50, marker='+', c='r')
ax.scatter(negative['X1'], negative['X2'], label='negative', s=50, marker='o', c='b')
ax.legend(loc='best')
ax.set_xlabel('X1')
ax.set_ylabel('X2')

# 决策边界, 使用等高线表示
x1 = np.arange(0, 4.5, 0.01)
x2 = np.arange(0, 5, 0.01)
x1, x2 = np.meshgrid(x1, x2)
y_pred = np.array([svc400.predict(np.vstack((a, b)).T) for (a, b) in zip(x1, x2)])
plt.contour(x1, x2, y_pred, colors='g', linewidths=.5)

plt.show()

data['SVM400 Confidence'] = svc400.decision_function(data[['X1', 'X2']])

fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(data['X1'], data['X2'], s=50, c=data['SVM400 Confidence'], cmap='seismic')
ax.set_title('SVM(C=400) Decision Confidence')
ax.set_xlabel('X1')
ax.set_ylabel('X2')

# 决策边界, 使用等高线表示
x1 = np.arange(0, 4.5, 0.01)
x2 = np.arange(0, 5, 0.01)
x1, x2 = np.meshgrid(x1, x2)
y_pred = np.array([svc400.predict(np.vstack((a, b)).T) for (a, b) in zip(x1, x2)])
plt.contour(x1, x2, y_pred, colors='g', linewidths=.5)

plt.show()

 

data.head()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值