机器学习与模式识别——监督式学习算法基础
一.实验目的
- 熟悉感知器算法的具体实现。
- 掌握感知器算法在实际问题上的应用。
二.实验内容
1.上机实验题一
山鸢尾问题是一个二元分类问题,其任务是仅仅利用花萼长与花萼宽这两个特征预测判定鸢尾花是否为山鸢尾。从鸢尾花数据集中随机采样90条数据作为训练数据,并将余下的60条作为测试数据。利用书本中图2.9中的感知器算法来解决山尾花问题。实现图2.11和2.12。
2.上机实验题二 墨渍分类问题
在平面上有两摊墨渍,它们的颜色分别是黄色与蓝色。墨渍分类问题的任务是根据点的坐标判断其染上的墨渍的颜色。墨渍分类问题的数据集已经集成在 Sklearn 的数据库中。数据集的每条数据都是平面上的一个点。特征组为该点的坐标。标签为该点被染成的颜色, 0 表示黄色, 1 表示蓝色图 2.19 是100条数据采样。

图2.20是获取数据与观察数据的程序。请基于图2.20中的程序, 用感知器算法来解决墨渍分类问题。

三.实验要求
1.结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果。
2.整理上机步骤,总结经验和体会。
3.完成实验报告和上交源程序
四.实验过程
1.上机实验题一
感知器算法是一种线性分类模型,用于解决二分类问题。首先,从iris数据集中提取花萼长度和宽度这两个特征,并构造相应的标签。接着,将数据集分为训练集和测试集。在训练阶段,感知器通过迭代更新权重和偏置,直到模型能够正确分类所有训练样本。一旦训练完成,就可以使用这个模型来预测测试集中样本的类别。为了直观展示模型的分类效果,绘制了训练数据和测试数据的散点图,并在图上绘制了决策边界,从而可以清晰地看到模型是如何将不同类别的数据分开的。
运行代码:
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
class Perceptron:
def fit(self,X,y):
m,n = X.shape
w = np.zeros((n,1))
b = 0
done = False
while not done:
done = True
for i in range(m):
x = X[i].reshape(1,-1)
if y[i] * (x.dot(w) + b) <= 0:
w = w + y[i] * x.T
b = b + y[i]
done = False
self.w = w
self.b = b
def predict(self,X):
return np.sign(X.dot(self.w) + self.b)
iris = datasets.load_iris()
X = iris['data'][:,(0,1)]
y = 2 * (iris["target"] == 0).astype(int) - 1
X_train,X_test,y_train,y_test = train_test_split(X ,y ,test_size= 0.4, random_state= 5)
model = Perceptron()
model.fit(X_train,y_train)
model.predict(X_test)
# 绘制数据点和决策边界
def plot_data(X, y, title):
plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', edgecolor='k', s=20)
plt.title(title)
plt.xlabel('花萼长') # 花萼长度
plt.ylabel('花萼宽') # 花萼宽度
plt.show()
# 绘制训练数据
plot_data(X_train, y_train, "训练数据")
# 绘制测试数据
plot_data(X_test, y_test, "测试数据")
# 绘制决策边界
def plot_decision_boundary(X, y, model, title):
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.8, cmap='bwr')
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', edgecolor='k', s=20)
plt.title(title)
plt.xlabel('花萼长') # 花萼长度
plt.ylabel('花萼宽') # 花萼宽度
plt.show()
# 绘制训练集的决策边界
plot_decision_boundary(X_train, y_train, model, "感知器算法对训练数据的区分效果")
# 绘制测试集的决策边界
plot_decision_boundary(X_test, y_test, model, "感知器算法对测试数据的区分效果")

2.上机实验题二 墨渍分类问题
首先,生成了一个包含100个样本的数据集,这些样本被分为两个类别,并且每个类别的样本点在二维空间中随机分布。接着,通过散点图直观地展示了这些数据点,其中不同的颜色代表不同的类别。然后,将数据集分为训练集和测试集,比例为7:3。使用训练集,训练了一个感知器模型,并且使用测试集来评估模型的预测能力。在模型训练完成后,提取了模型的权重向量和偏置项,这些参数定义了分类的决策边界。决策边界是一个线性方程,它将二维空间划分为两个区域,每个区域对应一个类别。最后,在图中绘制了数据点和决策边界,以直观地展示感知器模型是如何区分这两个类别的。
运行代码:
import numpy as np
from sklearn.datasets import load_digits, make_blobs
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Perceptron
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集
X , y = make_blobs(n_samples = 100,centers = 2,n_features = 2,
cluster_std = 0.6 ,random_state = 0)
plt.plot(X[:,0][y==1],X[:,1][y==1],"bs",ms = 3)
plt.plot(X[:,0][y==0],X[:,1][y==0],"yo",ms = 3)
plt.title('墨渍分类的数据采样')
plt.show()
X_train,X_test,y_train,y_test = train_test_split(X ,y ,test_size= 0.3, random_state= 5)
model = Perceptron(tol=1e-3, random_state=0)
model.fit(X_train,y_train)
model.predict(X_test)
# 获取权重向量和偏置项
w = model.coef_[0]
b = model.intercept_
# 定义决策边界的方程: w[0]*x + w[1]*y + b = 0
def decision_boundary(x):
return (-w[0] * x - b) / w[1]
plt.figure(figsize=(8, 6))
# 绘制数据点
colors = ['y', 'b'] # 自定义的颜色列表
for i in range(2): # 因为只有两个类别
plt.scatter(X[y == i, 0], X[y == i, 1], c=colors[i], label=f'Class {i}', s=50)
# 绘制决策边界
x_values = np.linspace(-1, 4, 100)
y_values = decision_boundary(x_values)
plt.plot(x_values, y_values, '-r', linewidth=2, label='Decision Boundary')
# 添加标题和标签
plt.title('感知器算法的区分效果')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
# 显示图形
plt.grid(True)
plt.show()

五.实验心得
我深入体验了感知器算法在解决实际分类问题中的应用。通过两个具体的实验题目——山鸢尾问题和墨渍分类问题,我不仅熟悉了感知器算法的具体实现,还掌握了其在实际问题中的应用方法。
在实验一中,我利用iris数据集中的花萼长度和宽度特征,预测鸢尾花是否为山鸢尾。这个过程中,我学会了如何从实际数据集中提取特征,构造标签,并使用这些数据来训练感知器模型。通过迭代更新权重和偏置,模型最终能够正确分类训练样本,并且在测试集上也取得了不错的预测效果。绘制数据点和决策边界的过程,让我直观地理解了感知器是如何在特征空间中划分不同类别的。
实验二中的墨渍分类问题则更加直观,我通过生成的数据集和散点图,观察了感知器模型是如何区分不同颜色的墨渍。这个实验让我体会到了感知器算法在处理非线性可分数据集时的局限性,同时也让我对线性分类模型有了更深入的认识。
通过这两个实验,我认识到了感知器算法作为一种基础的线性分类器,在某些问题上的有效性,以及在其他问题上的局限性。我也学会了如何通过绘图来直观展示模型的分类效果,这对于理解和解释模型的预测结果非常有帮助。
更多推荐
所有评论(0)