机器学习之感知机原理及Python实现

本文介绍了机器学习算法感知机,它是简单的二分类线性模型,是神经网络和支持向量机的基础。阐述了感知机原理,包括映射函数、线性分离超平面、损失函数及梯度下降法更新参数。还说明了算法实现思路,如参数初始化、模型主体、参数优化等,并可建类方便调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习算法感知机(perceptron)。感知机是一种较为简单的二分类模型,但由简至繁,感知机却是神经网络和支持向量机的基础。感知机旨在学习能够将输入数据划分为+1/-1的线性分离超平面,所以说整体而言感知机是一种线性模型。因为是线性模型,所以感知机的原理并不复杂,本节和大家来看一下感知机的基本原理和Python实现。

感知机原理

     假设输入x表示为任意实例的特征向量,输出y={+1,-1}为实例的类别。感知机定义由输入到输出的映射函数如下:

图片

     其中sign符号函数为:

图片

     w和b为感知机模型参数,也是感知机要学习的东西。w和b构成的线性方程wx+b=0极为线性分离超平面。

图片

     假设数据是线性可分的,当然有且仅在数据线性可分的情况下,感知机才能奏效。感知机模型简单,但这也是其缺陷之一。所谓线性可分,也即对于任何输入和输出数据都存在某个线性超平面wx+b=0能够将数据集中的正实例点和负实例点完全正确的划分到超平面两侧,这样数据集就是线性可分的。

     感知机的训练目标就是找到这个线性可分的超平面。为此,定义感知机模型损失函数如下:

图片

     要优化这个损失函数,可采用梯度下降法对参数进行更新以最小化损失函数。计算损失函数关于参数w和b的梯度如下:

图片

     由上可知完整的感知机算法包括参数初始化、对每个数据点判断其是否误分,如果误分,则按照梯度下降法更新超平面参数,直至没有误分类点。

图片

     以上便是感知机算法的基本原理。当然这里说的感知机仅限于单层的感知机模型,仅适用于线性可分的情况。对于线性不可分的情形,笔者将在后续的神经网络和感知机两讲详细介绍。

感知机算法实现

     完整的感知机算法包括参数初始化、模型主体、参数优化等部分,我们便可以按照这个思路来实现感知机算法。在正式写模型之前,我们先用sklearn来准备一下示例数据。

# 导入相关库
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# 导入iris数据集
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']

# 绘制散点图
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], c='red', label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], c='green', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend();

图片

# 取两列数据并将并将标签转化为1/-1
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
y = np.array([1 if i == 1 else -1 for i in y])

 下面正式开始模型部分。先定义一个参数初始化函数:

# 定义参数初始化函数
def initilize_with_zeros(dim):
    w = np.zeros(dim)
    b = 0.0
    return w, b
然后定义sign符号函数:
# 定义sign符号函数
def sign(x, w, b):
    return np.dot(x,w)+b
最后定义模型训练和优化部分:
# 定义感知机训练函数
def train(X_train, y_train, learning_rate):
    # 参数初始化
    w, b = initilize_with_zeros(X_train.shape[1])
    # 初始化误分类
    is_wrong = False
    while not is_wrong:
        wrong_count = 0
        for i in range(len(X_train)):
            X = X_train[i]
            y = y_train[i]
            # 如果存在误分类点
            # 更新参数
            # 直到没有误分类点
            if y * sign(X, w, b) <= 0:
                w = w + learning_rate*np.dot(y, X)
                b = b + learning_rate*y
                wrong_count += 1
        if wrong_count == 0:
            is_wrong = True
            print('There is no missclassification!')
        
        # 保存更新后的参数
        params = {
            'w': w,
            'b': b
        }
    return params
对示例数据进行训练:
params = train(X, y, 0.01)
params

图片

最后对训练结果进行可视化,绘制模型的决策边界:​​​​​​​

x_points = np.linspace(4, 7, 10)
y_hat = -(params['w'][0]*x_points + params['b'])/params['w'][1]
plt.plot(x_points, y_hat)
plt.plot(data[:50, 0], data[:50, 1], color='red', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], color='green', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

图片

最后,我们也可以建一个perceptron类来方便调用。对上述代码进行整理:

class Perceptron:
    def __init__(self):
        pass
    
    def sign(self, x, w, b):
        return np.dot(x, w) + b
    
    def train(self, X_train, y_train, learning_rate):
        # 参数初始化
        w, b = self.initilize_with_zeros(X_train.shape[1])
        # 初始化误分类
        is_wrong = False
        while not is_wrong:
            wrong_count = 0
            for i in range(len(X_train)):
                X = X_train[i]
                y = y_train[i]
                # 如果存在误分类点
                # 更新参数
                # 直到没有误分类点
                if y * self.sign(X, w, b) <= 0:
                    w = w + learning_rate*np.dot(y, X)
                    b = b + learning_rate*y
                    wrong_count += 1
            if wrong_count == 0:
                is_wrong = True
                print('There is no missclassification!')
            # 保存更新后的参数
            params = {
                'w': w,
                'b': b
            }
        return params

                
### 头歌平台中的机器学习感知机教程与实验 头歌(Tougo)是一个专注于实践教学的在线教育平台,提供丰富的编程练习和项目实操机会。对于机器学习初学者来说,感知机作为最基础的线性分类模型之一,在许多课程中被广泛讲解。 #### 感知机的基础概念 感知机是一种用于二类分类问题的线性分类模型,其核心思想来源于生物神经元的工作机制[^3]。它通过调整权重向量 \(w\) 和偏置项 \(b\) 来找到能够区分两类样本的最佳超平面。具体而言,感知机的学习目标是最小化误分类点到当前分离直线的距离总和。 在实际应用中,感知机通常采用梯度下降法或其他优化策略更新参数。当训练集线性可分时,感知机可以通过不断迭代最终收敛至最优解;而对于非线性可分的情况,则可能无法完全消除错误分类现象[^4]。 #### 头歌平台上感知机相关内容概述 以下是头歌平台可能涉及的一些典型模块及其特点: 1. **理论讲解部分** - 提供详尽的文字说明以及图形演示,帮助学生直观理解感知机工作原理。 - 结合《机器学习平台架构实战》一书中的案例分析,加深对算法应用场景的认识[^1]。 2. **代码实现环节** 下面给出一段简单的Python代码示例,展示如何手动构建一个基本版本的感知机: ```python import numpy as np class Perceptron: def __init__(self, learning_rate=0.01, max_epochs=100): self.learning_rate = learning_rate self.max_epochs = max_epochs def fit(self, X, y): n_samples, n_features = X.shape self.weights = np.zeros(n_features) self.bias = 0 for _ in range(self.max_epochs): for idx, x_i in enumerate(X): linear_output = np.dot(x_i, self.weights) + self.bias predicted_class = np.where(linear_output >= 0, 1, -1) update = self.learning_rate * (y[idx] - predicted_class) self.weights += update * x_i self.bias += update def predict(self, X): linear_output = np.dot(X, self.weights) + self.bias return np.where(linear_output >= 0, 1, -1) ``` 3. **动手实验区** 学生可以在虚拟环境中运行上述程序片段,并尝试修改不同参数观察效果变化。例如改变初始学习率或者最大轮次限制等设置,从而更深刻体会各因素间相互作用关系[^5]。 4. **评估反馈体系** 完成指定任务后,系统会自动生成评分报告并指出潜在改进方向,鼓励反复练习直至掌握要点为止。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

缓下脚步

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

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

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

打赏作者

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

抵扣说明:

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

余额充值