人工智能与机器学习原理精解【1】

文章目录

Rosenblatt感知器

基础

  • 感知器,也可翻译为感知机,是一种人工神经网络。它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。
  • Rosenblatt感知器建立在一个非线性神经元上,但是它只能完成线性分类
  • 硬限幅与超平面
    局部诱导域 v = ∑ i = 1 m w i x i + b 从上面公式看来,只能完成线性分类 完成线性分类靠最后的输出,就是硬限幅的功能了 输入为正数,输出 + 1 ,否则输出 − 1 。 如果 v > 0 输出 + 1 ,否则输出 − 1 。 v = 0 就是一个超平面,线性分隔两类(也叫两个决策区域) 局部诱导域 \\v=\sum_{i=1}^mw_ix_i+b \\从上面公式看来,只能完成线性分类 \\完成线性分类靠最后的输出,就是硬限幅的功能了 \\输入为正数,输出+1,否则输出-1。 \\如果 v>0 输出 +1,否则输出-1。 \\v=0就是一个超平面,线性分隔两类(也叫两个决策区域) 局部诱导域v=i=1∑mwixi+b从上面公式看来,只能完成线性分类完成线性分类靠最后的输出,就是硬限幅的功能了输入为正数,输出+1,否则输出−1。如果v>0输出+1,否则输出−1。v=0就是一个超平面,线性分隔两类(也叫两个决策区域)
    为什么Rosenblatt感知器是非线性神经元,因为硬限幅的存在。

收敛算法

下面内容来自文心一言的自动生成内容

Rosenblatt的收敛算法,也被称为感知器收敛算法或Rosenblatt误差修正训练规则,是一种用于训练单层感知机的算法。该算法由Frank

Rosenblatt在1957年提出,主要用于解决二分类问题。以下是对该算法的详细解释:

算法概述

Rosenblatt的收敛算法是一个迭代过程,通过不断调整感知机的权重和偏置(阈值),使得感知机能够正确分类给定的输入数据。

算法步骤

  1. 初始化

    • 权重向量w(0)初始化为0或随机值。
    • 偏置b(在算法中通常包含在权重向量中,作为w(0)的一个分量)也初始化为0或随机值。
  2. 迭代过程

    • 对于每一个输入样本x(n)(其中n代表时间步或样本序号)和对应的期望输出d(n)
      • 计算输出y(n) = sgn(w(n) * x(n)),其中sgn是符号函数,当w(n) * x(n)大于0时返回1,小于0时返回-1,等于0时可以根据需要定义。
      • 计算误差e(n) = d(n) - y(n)
      • 更新权重和偏置w(n+1) = w(n) + q * e(n) * x(n),其中q是学习率参数,通常是一个小于1的正数。
    • 重复上述过程,直到满足停止条件。
  3. 停止条件

    • 可以是达到预设的最大迭代次数。
    • 也可以是网络的输出与期望输出的误差小于某个预设的阈值。

关键点说明

  • 学习率q):学习率决定了权重更新的步长。较大的学习率可能导致算法收敛速度加快,但也可能导致算法不稳定;较小的学习率则可能使算法收敛速度变慢,但更加稳定。
  • 权重和偏置:权重和偏置是感知机的可调整参数,通过调整这些参数,感知机可以学习如何正确分类输入数据。
  • 符号函数sgn):符号函数用于将加权输入转换为二元输出。在实际应用中,可以根据需要选择其他激活函数来替代符号函数。

总结

Rosenblatt的收敛算法是一种简单而有效的神经网络学习算法,它通过不断调整感知机的权重和偏置来使得网络能够逐渐逼近最优解,实现正确的分类。需要注意的是,该算法仅适用于线性可分的问题。对于非线性可分的问题,需要使用更复杂的神经网络算法来解决。

可在文心一言中输入更多相关内容查询。

C++实现

要点

  • 把偏置b作为权值的第一个元素 w ( 0 ) w(0) w(0)
  • 对应权值的输入x,设置为+1
  • 样本文件可在iris网站下载。但注意只留两种花的样本,因为这是二分类,只能线性分为两类。

代码

cpp 复制代码
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <regex>
#include "e:/eigen/Eigen/Dense"


using namespace std;
using namespace Eigen;

struct IrisDa{
    float *irisX;
    int dataSize;
    int d;
    ~IrisDa(){
        delete[] irisX;
    }
};
struct IrisDaW{
    float *irisW;
    int dataSize;
    ~IrisDaW(){
        delete[] irisW;
    }
};
IrisDaW *irisDaW=nullptr;//权值参数

vector<string> split(const string &text, char separator);
string removeSpaces(const string& input);
void dataLearn(const IrisDa *irisDa);
int sgn(float x);
void showIrisW();
void dataTest();
void rbTest(const IrisDa *irisDa);

int main(){

    ifstream fileIn;
    char helloStr[100];
    //read csv
    fileIn.open("e:/ml_data/iris/iris_sample.data");
    if (!fileIn.is_open()){
        cout<<"打开失败!"<<endl;
        return 1;
    }

    regex strRx(R"((\d+)(\.)(\d+))");
    smatch match;
    while (fileIn>>helloStr){
        //construct x(n) and d(n)
        IrisDa *irisDa=new IrisDa;
        vector<string> sampleDatas=split(helloStr,',');
        int dataCount=sampleDatas.size();
        float *irisX= new float[dataCount];//x(n)
        irisX[0]=1.0;
        int irisD;//d(n)
        int i=1;
        for (const string &data: sampleDatas) {
            string irisData=removeSpaces(data);
            bool found = regex_match(irisData, match, strRx);
            if (found) {
                irisX[i]=stof(irisData);
                i++;
            }
            else{
                if (irisData=="Iris-setosa"){
                    irisD=1;
                }
                else{
                    irisD=-1;
                }
            }
        }
        irisDa->irisX=irisX;
        irisDa->d=irisD;
        irisDa->dataSize=dataCount;
        dataLearn(irisDa);
        showIrisW();
    }
    fileIn.close();
    dataTest();
}

void rbTest(const IrisDa *irisDa){
    if (!irisDaW){
        cout<<"请检查参数w是否生成!"<<endl;
        return ;
    }
    cout<<"正在处理测试数据..."<<endl;
    for (int i=0;i<irisDa->dataSize;i++) {
        cout<<irisDa->irisX[i]<<" ";
    }
    cout<<endl;
    VectorXf irisW(irisDa->dataSize);
    VectorXf irisX(irisDa->dataSize);
    for (int i=0;i<irisDa->dataSize;i++){
        irisX[i]=irisDa->irisX[i];
        irisW[i]=irisDaW->irisW[i];
    }
    float y=sgn(irisW.transpose()*irisX);
    cout<<"正确分类:"<<irisDa->d<<"预测分类:"<<y<<endl;
}

void dataLearn(const IrisDa *irisDa){//训练样本
    float a=0.25;
    cout<<"正在处理数据..."<<endl;
    for (int i=0;i<irisDa->dataSize;i++) {
        cout<<irisDa->irisX[i]<<" ";
    }
    cout<<irisDa->d<<endl;
    if (!irisDaW) {
        irisDaW=new IrisDaW;
        irisDaW->irisW=new float[irisDa->dataSize]{0.0};
        irisDaW->dataSize=irisDa->dataSize;
    }
    VectorXf irisW(irisDa->dataSize);
    VectorXf irisX(irisDa->dataSize);
    for (int i=0;i<irisDa->dataSize;i++){
        irisX[i]=irisDa->irisX[i];
        irisW[i]=irisDaW->irisW[i];
    }
    float y=sgn(irisW.transpose()*irisX);
    irisW=irisW+a*(irisDa->d-y)*irisX;
    for (int i=0;i<irisDa->dataSize;i++){
        irisDaW->irisW[i]=irisW[i];
    }
}

void showIrisW(){
    cout<<"权值:"<<endl;
    for (int i=0;i<irisDaW->dataSize;i++){
        cout<<irisDaW->irisW[i]<<" ";
    }
    cout<<endl;
}

void dataTest(){//样本测试
    ifstream fileIn;
    char helloStr[100];
    //read csv
    fileIn.open("e:/ml_data/iris/iris_test.data");
    if (!fileIn.is_open()){
        cout<<"打开失败!"<<endl;
        return ;
    }

    regex strRx(R"((\d+)(\.)(\d+))");
    smatch match;
    while (fileIn>>helloStr){
        //construct x(n) and d(n)
        IrisDa *irisDa=new IrisDa;
        vector<string> sampleDatas=split(helloStr,',');
        int dataCount=sampleDatas.size();
        float *irisX= new float[dataCount];//x(n)
        irisX[0]=1.0;
        int irisD;//d(n)
        int i=1;
        for (const string &data: sampleDatas) {
            string irisData=removeSpaces(data);
            bool found = regex_match(irisData, match, strRx);
            if (found) {
                irisX[i]=stof(irisData);
                i++;
            }
            else{
                if (irisData=="Iris-setosa"){
                    irisD=1;
                }
                else{
                    irisD=-1;
                }
            }
        }
        irisDa->irisX=irisX;
        irisDa->d=irisD;
        irisDa->dataSize=dataCount;
        rbTest(irisDa);
    }
    fileIn.close();
}


int sgn(float x){
    if (x>=0) {
            return 1;
    }
    else {
            return -1;
    }
}

vector<string> split(const string &text, char separator) {
    vector<string> tokens;
    stringstream ss(text);
    string item;
    while (getline(ss, item, separator)) {
        if (!item.empty()) {
            tokens.push_back(item);
        }
    }
    return tokens;
}

string removeSpaces(const string& input) {
    string result = input;
    result.erase(std::remove(result.begin(), result.end(), ' '), result.end());
    return result;
}

运行效果如下:

bash 复制代码
正在处理数据...
1 5.1 3.5 1.4 0.2 1
权值:
0 0 0 0 0
正在处理数据...
1 4.9 3 1.4 0.2 1
权值:
0 0 0 0 0
正在处理数据...
1 4.7 3.2 1.3 0.2 1
权值:
0 0 0 0 0
正在处理数据...
1 4.6 3.1 1.5 0.2 1
权值:
0 0 0 0 0
正在处理数据...
1 5.6 2.5 3.9 1.1 -1
权值:
-0.5 -2.8 -1.25 -1.95 -0.55
正在处理数据...
1 6.7 3 5 1.7 -1
权值:
-0.5 -2.8 -1.25 -1.95 -0.55
正在处理数据...
1 6.4 2.9 4.3 1.3 -1
权值:
-0.5 -2.8 -1.25 -1.95 -0.55
正在处理数据...
1 6.6 3 4.4 1.4 -1
权值:
-0.5 -2.8 -1.25 -1.95 -0.55
正在处理数据...
1 6.8 2.8 4.8 1.4 -1
权值:
-0.5 -2.8 -1.25 -1.95 -0.55
正在处理数据...
1 5.1 3.3 1.7 0.5 1
权值:
0 -0.25 0.4 -1.1 -0.3
正在处理数据...
1 4.8 3.4 1.9 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5 3 1.6 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5 3.4 1.6 0.4 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5.2 3.5 1.5 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5.2 3.4 1.4 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 4.7 3.2 1.6 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5.1 3.8 1.9 0.4 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 4.8 3 1.4 0.3 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5.1 3.8 1.6 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 4.6 3.2 1.4 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5.3 3.7 1.5 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 5 3.3 1.4 0.2 1
权值:
0.5 2.15 2.1 -0.15 -0.2
正在处理数据...
1 7 3.2 4.7 1.4 -1
权值:
0 -1.35 0.5 -2.5 -0.9
正在处理数据...
1 6.4 3.2 4.5 1.5 -1
权值:
0 -1.35 0.5 -2.5 -0.9
正在处理数据...
1 6.9 3.1 4.9 1.5 -1
权值:
0 -1.35 0.5 -2.5 -0.9
正在处理数据...
1 5.5 2.3 4 1.3 -1
权值:
0 -1.35 0.5 -2.5 -0.9
正在处理数据...
1 4.8 3 1.4 0.1 1
权值:
0.5 1.05 2 -1.8 -0.85
正在处理数据...
1 4.3 3 1.1 0.1 1
权值:
0.5 1.05 2 -1.8 -0.85
正在处理数据...
1 5.8 4 1.2 0.2 1
权值:
0.5 1.05 2 -1.8 -0.85
正在处理数据...
1 5.7 4.4 1.5 0.4 1
权值:
0.5 1.05 2 -1.8 -0.85
正在处理数据...
1 5.7 2.8 4.5 1.3 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 6.3 3.3 4.7 1.6 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 4.9 2.4 3.3 1 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 6.6 2.9 4.6 1.3 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 5.2 2.7 3.9 1.4 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 5 2 3.5 1 -1
权值:
0 -1.8 0.6 -4.05 -1.5
正在处理数据...
1 4.8 3.1 1.6 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.4 3.4 1.5 0.4 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.2 4.1 1.5 0.1 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.5 4.2 1.4 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.1 3.4 1.5 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5 3.5 1.3 0.3 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.5 2.3 1.3 0.3 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.4 3.2 1.3 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5 3.5 1.6 0.6 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.9 3 4.2 1.5 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6 2.2 4 1 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6.1 2.9 4.7 1.4 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.6 2.9 3.6 1.3 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6.7 3.1 4.4 1.4 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.4 3.7 1.5 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.8 3.4 1.6 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.6 3 4.5 1.5 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.8 2.7 4.1 1 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6.2 2.2 4.5 1.5 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.9 3.1 1.5 0.1 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5 3.2 1.2 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.5 3.5 1.3 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.9 3.1 1.5 0.1 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.4 3 1.3 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.6 2.7 4.2 1.3 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.7 3 4.2 1.2 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.7 2.9 4.2 1.3 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6.2 2.9 4.3 1.3 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.1 2.5 3 1.1 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.4 2.9 1.4 0.2 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 4.9 3.1 1.5 0.1 1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.5 2.4 3.8 1.1 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.5 2.4 3.7 1 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.8 2.7 3.9 1.2 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6 2.7 5.1 1.6 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.4 3 4.5 1.5 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 6 3.4 4.5 1.6 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理数据...
1 5.7 2.8 4.1 1.3 -1
权值:
0.5 0.6 2.15 -3.25 -1.4
正在处理测试数据...
1 6 2.9 4.5 1.5
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.7 2.6 3.5 1
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.5 2.8 4.6 1.5
正确分类:-1预测分类:-1
正在处理测试数据...
1 5 2.3 3.3 1
正确分类:-1预测分类:-1
正在处理测试数据...
1 5 3.6 1.4 0.2
正确分类:1预测分类:1
正在处理测试数据...
1 5.4 3.9 1.7 0.4
正确分类:1预测分类:1
正在处理测试数据...
1 4.6 3.4 1.4 0.3
正确分类:1预测分类:1
正在处理测试数据...
1 5 3.4 1.5 0.2
正确分类:1预测分类:1
正在处理测试数据...
1 6.7 3.1 4.7 1.5
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.3 2.3 4.4 1.3
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.6 3 4.1 1.3
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.5 2.5 4 1.3
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.5 2.6 4.4 1.2
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.1 3 4.6 1.4
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.8 2.6 4 1.2
正确分类:-1预测分类:-1
正在处理测试数据...
1 5.4 3.9 1.3 0.4
正确分类:1预测分类:1
正在处理测试数据...
1 5.1 3.5 1.4 0.3
正确分类:1预测分类:1
正在处理测试数据...
1 5.7 3.8 1.7 0.3
正确分类:1预测分类:1
正在处理测试数据...
1 5.1 3.8 1.5 0.3
正确分类:1预测分类:1
正在处理测试数据...
1 5.4 3.4 1.7 0.2
正确分类:1预测分类:1
正在处理测试数据...
1 5.1 3.7 1.5 0.4
正确分类:1预测分类:1
正在处理测试数据...
1 4.6 3.6 1 0.2
正确分类:1预测分类:1
正在处理测试数据...
1 5.9 3.2 4.8 1.8
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.1 2.8 4 1.3
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.3 2.5 4.9 1.5
正确分类:-1预测分类:-1
正在处理测试数据...
1 6.1 2.8 4.7 1.2
正确分类:-1预测分类:-1

Process returned 0 (0x0)   execution time : 0.901 s
Press any key to continue.

参考文献

1、《神经网络与机器学习 第三版》

相关推荐
AI极客菌1 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭1 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Power20246662 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k2 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
沉下心来学鲁班2 小时前
复现LLM:带你从零认识语言模型
人工智能·语言模型
数据猎手小k2 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
YRr YRr2 小时前
深度学习:循环神经网络(RNN)详解
人工智能·rnn·深度学习
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘