zoukankan      html  css  js  c++  java
  • 机器学习入门篇——感知器

    1.机器学习的基本概念:
    三种主要的学习方式:
    1. 监督学习:使用有类标的训练数据构建模型,即在训练过程中,所有的数据都是知道它的类别的。通过构建的这个模型对未来的数据进行预测。在监督学习的下面,又可以分为分类(利用分类对类标进行预测),以及回归(使用回归预测连续输出值)。
    2. 无监督学习:在没有已知输出变量(分类问题中是数据的类标)和反馈函数指导的情况下提取有效信息来探索数据的整体结构。子领域:1.通过聚类发现数据的子群;2,数据压缩中的降维。
    3. 强化学习:构建一个系统,在与环境交互的过程中提高系统的性能。我们可以将强化学习视为与监督学习相关的一个领域。但是强化学习与监督学习不同的是,在强化学习中,并没有一个确定的类标或一个连续类型的值,而是一个通过反馈函数产生的一个反馈值。该反馈值是对当前的系统行为的一个评价。强化学习解决的主要是交互式问题。象棋对弈就是一个常用的强化学习的例子。
    机器学习的工作流程(使用预测模型进行数据分析):

    如图,机器学习的学习分为两个部分,第一部分是训练阶段,通过数据带入模型中,训练生成最终模型,第二部分是测试阶段,通过新的数据经验模型的泛化能力。

    2.感知器
      2.1感知器原理
    感知器由费兰克·罗森布拉特(Frank Rossenblatt)基于MPC神经元模型提出。感知器可以看作一个处理二分类问题的算法。
    感知器的训练过程如下图:
     
     

    第一步:得到净输入函数z;z为矩阵X与权值矩阵W的乘积,再加上一个权值偏差得到z:
    第二步:通过激励函数得到输出的类标:

    第三步,在训练阶段,通过激励函数获得到模型输出的类标y,在将类标与实际类标进行计算得到误差,进行权值更新。进行权值更新是以下的方法更新

    图片
      其中           η为学习速率,y(i)第i个样本数据的真实类标,y(i)’第i个样本预测得出的目标,xj(i)为第i个样本中第j个值。
    2.2实现算法
    定义一个perception 类,
    实现算法:1.初始化权值,
          2.计算输出值,
          3.训练模型:计算误差,进行权值更新。
    
    public class perception {
    	
    	public float[] weigth;//权值
    	
    	public float[][] x;//输入值
    	
    	public int[] y;//样本的真实类标
    	
    	public float rate;//学习数率,决定每一次循环训练中所产生的权值变化;
    	
    	public float[] output;//输出的类标
    	
    	public float b=0;//阈值,也称为偏差
    
    	/**
    	 * 实例化感知器
    	 * @param x 输入的数据
    	 * @param d  学习速率
    	 */
    	public perception(float[][] x, float d,int[] y) {
    		super();
    		this.x = x;//输入数据
    		this.rate = d;//学习数率
    		this.y=y;//样本的真实类标
    		weigth=new float[x[0].length];//初始化权值数组
    	    randomWeigth(x[0].length);//随机给权值赋值
    	}
    	/**
    	 * 给权值进行赋值,初始值为0
    	 * @param n 权值数组的大小
    	 */
    	public void randomWeigth(int n){
    		
    	   // Random random = new Random();
    	    for(int i=0;i<n;i++){
    		    weigth[i]=0;
    	    }
    	}
    
    	/**
    	 * 训练感知器:计算出误差,然后进行权值更新
    	 */
    	public void train(){
    		output=new float[x.length];
    		//获取输出值
    		for(int i=0;i<x.length;i++){
    			output[i]=getoutput(x[i]);
    		}
    		//更新
    		for(int i=0;i<output.length;i++){
    			float update=rate*(y[i]-output[i]);
    			//更新权重
    			for(int j=0;j<weigth.length;j++){
    				weigth[j]=weigth[j]+update*x[i][j];
    			}
    			//更新偏差
    			b=b+update;
    		}
    		
    		
    	}
    	//计算输出值
    	public int getoutput(float[] x){
    		int output;//输出值
                    //计算净输入
    		float z = 0;
    		for(int i=0;i<x.length;i++){
    			z+=x[i]*weigth[i];
    		}
                    //激励函数
    		if(z>=b)
    		    output=1;
    		else
    			output=-1;
    		return output;
    	}  
    	
    }
    

     


     
  • 相关阅读:
    索引的使用说明
    如何在Linux 发行版本CentOS安装Oracle
    GNU/Linux 初學之旅
    Oracle数据库监听配置(转)
    Linux学习笔记7用户建立密码设置及删除用户
    Linux学习笔记6ls命令
    linux vi命令使用
    生成1千万个随机串号9位英文字母
    郁闷的夏天
    网络爬虫
  • 原文地址:https://www.cnblogs.com/hesi/p/7149678.html
Copyright © 2011-2022 走看看