首页 > 编程语言 >机器学习入门-用Java实现简单感知机

机器学习入门-用Java实现简单感知机

时间:2023-06-07 10:06:08浏览次数:44  
标签:1.0 入门 Point 感知机 3.0 new Java 2.0


一、通俗理解机器学习

1、机器学习是人工智能的一种,如图所示,它是人工智能的一个子方向。

机器学习入门-用Java实现简单感知机_数据

2、机器学习有点像人类的学习过程。

1. 人类学习通过经验(事件),归纳出规律。
2. 机器学习通过数据,训练出模型。

机器学习入门-用Java实现简单感知机_机器学习_02

3、机器学习不是基于编程形成的直接结果,不是代码直接写出一个模型 y = -0.3x + 6,而是通过归纳得出来的模型,例如,通过初始化 y = ax + b 中的 a、b,不断迭代,获得针对样本数据最优的 a、b 值,即得到对应的、归纳出来的最优的模型。

4、机器学习中,会用一些真实的数据对算法构建的模型进行评估,评估模型的性能,如果这个模型能达到要求,就用来测试其他的数据,如果达不到要求就要调整算法来重新建立模型,再次进行评估,如此循环往复,最终获得满意的模型来处理其他的数据。

二、简单理解感知机

感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法 对损失函数进行最优化(最优化)。感知机的学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。感知机由Rosenblatt于1957年提出的,是神经网络和支持向量机的基础。

  拿二维平面举例,

机器学习入门-用Java实现简单感知机_感知机_03

看这张图,很明显,直线没有将红蓝点完全分开在两个区域,我们可以将其称为错误的直线,感知机要做的,就是根据各点坐标,将错误的直线纠正为正确的,这样得到的直线就是训练的结果。

说了这么多,要怎么实现呢?  看下面的流程图

机器学习入门-用Java实现简单感知机_java_04

三、用Java实现感知机

1、关于w与b的修改

我们会定义一个变量η(0≤η≤1)作为步长,在统计学是中成为学习速率。步长越大,梯度下降的速度越快,更能接近极小点。如果步长过大,有可能导致跨过极小点,导致函数发散;如果步长过小,有可能会耗很长时间才能达到极小点。默认为1

对于wi   wi+=η*y*xi

对于b      b+=η*y

2、代码实现

package machineLearning;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test1 {

    public static int eta = 1;//步长,默认为1
    public static double w[] = {1.0,2.0,3.0,4.0};
    public static int b = 7;

    public static List<Point> arrayList;
    public static void main(String[] args) {
        Point p1 = new Point(new double[]{0, 0, 0, 1}, -1);
        Point p2 = new Point(new double[]{1, 0, 0, 0}, 1);
        Point p3 = new Point(new double[]{2, 1, 0, 0}, 1);
        Point p4 = new Point(new double[]{2, 1, 0, 1}, -1);
        arrayList = new ArrayList<>();
        arrayList.add(p1);
        arrayList.add(p2);
        arrayList.add(p3);
        arrayList.add(p4);
        boolean classify = classify();
    }

    /*
     * 判断所有点的位置关系,进行分类
     */
    public static boolean classify() {
        boolean flag = false;
        while (!flag) {
            for (int i = 0; i < arrayList.size(); i++) {
                if (Anwser(arrayList.get(i)) <= 0) {
                    Update(arrayList.get(i));
                    break;
                }
                if (i + 1 == arrayList.size()) {
                    flag = true;
                }
            }
        }
        return true;
    }

    /*
     * 点乘返回sum
     */
    private static double Dot(double[] w, double[] x) {
        double sum = 0;
        for (int i = 0; i < x.length; i++) {
            sum += w[i] * x[i];
        }
        return sum;
    }

    /*
     * 返回函数计算的值
     */
    private static double Anwser(Point point) {
        System.out.println("w:"+Arrays.toString(w));
        System.out.println("b:"+b);
        return point.y * (Dot(w, point.x) + b);
    }

    public static void Update(Point point) {
        for (int i = 0; i < w.length; i++) {
            w[i] += eta * point.y * point.x[i];
        }
        b += eta * point.y;
        return;
    }

}
class Point{
    double x[];
    int y;

    public Point(double[] x, int y) {
        this.x = x;
        this.y = y;
    }
}

3、测试结果

w:[1.0, 2.0, 3.0, 4.0]
b:7
w:[1.0, 2.0, 3.0, 3.0]
b:6
w:[1.0, 2.0, 3.0, 2.0]
b:5
w:[1.0, 2.0, 3.0, 1.0]
b:4
w:[1.0, 2.0, 3.0, 0.0]
b:3
w:[1.0, 2.0, 3.0, -1.0]
b:2
w:[1.0, 2.0, 3.0, -2.0]
b:1
w:[1.0, 2.0, 3.0, -2.0]
b:1
w:[1.0, 2.0, 3.0, -2.0]
b:1
w:[1.0, 2.0, 3.0, -2.0]
b:1
w:[-1.0, 1.0, 3.0, -3.0]
b:0
w:[-1.0, 1.0, 3.0, -3.0]
b:0
w:[0.0, 1.0, 3.0, -3.0]
b:1
w:[0.0, 1.0, 3.0, -3.0]
b:1
w:[0.0, 1.0, 3.0, -3.0]
b:1
w:[0.0, 1.0, 3.0, -3.0]
b:1

四、一些感想

用Java实现这个感知机后,发现机器学习并没有想象中那么难,目前理解还是比较浅显,后续还需继续学习机器学习相关内容。

标签:1.0,入门,Point,感知机,3.0,new,Java,2.0
From: https://blog.51cto.com/u_15564034/6429972

相关文章

  • Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案
     使用ExcelStreamingReader,这个第三方工具会把一部分的行(可以设置)缓存到内存中,在迭代时不断加载行到内存中,而不是一次性的加载所有记录到内存,这样就可以不断的读取excel内容并且不影响内存的使用。  但是这个工具也有一定的限制:只能用于读取excel的内容,写入操作不可用;可以使......
  • 基于JAVA知识管理系统的设计和实现
    系统功能系统分为网站前台和网站后台,前台主要为查阅文档功能、评分等,后台主要进行文档管理功能等。网站前所示台功能包括用户注册、登录、文档显示、搜索文档、浏览文档和评论文档。(1)注册在注册页面填写注册信息,要求填写用户名(汉字、字母、数字或下划线组成的字符串,且不能有重......
  • Java动态绑定机制
    Java的动态绑定机制当调用对象方法的时候,该方法会和该对象的内存地址\运行类型绑定当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用packagehspedu.poly_.dynamic_;publicclassDynamicBinding{publicstaticvoidmain(String[]args){Aa=newB(......
  • Dapr在Java中的实践 之 状态管理
    状态管理状态管理(StateManagement)使用键值对作为存储机制,可以轻松的使长时运行、高可用的有状态服务和无状态服务共同运行在我们的服务中。我们的服务可以利用Dapr的状态管理API在状态存储组件中保存、读取和查询键值对。状态存储组件是可插拔的,目前支持使用AzureCosmosDB、......
  • spring boot 集成 Neo4j org.neo4j.ogm.metadata.DomainInfo.useClassgraph(DomainIn
    springboot版本:2.2.13.RELEASE 问题在于引入后,报错spring-boot-starter-data-neo4j<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency>  *......
  • 基于JAVA的springboot+vue人事管理系统、员工工资管理系统,附源码+数据库+论文+PPT
    1、项目介绍考虑到实际生活中在人事管理方面的需要以及对该系统认真的分析,将系统权限按管理员和员工这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页,个人中心,员工管理,部门管理,员工考勤管理,请假申请管理,加班申请管理,员工工资管理,招聘计划管理,员工培训管理,部......
  • 【如何入门Python】
    (文章目录)人生苦短,我用Python。欢迎大家一起分享,你是如何入门Python的~方向一:你是如何学习/自学Python的?学习/自学Python的步骤如下:了解Python的基础知识:了解Python的语法、变量、数据类型、算术操作、流程控制语句、函数、模块和包等基础知识。学习Python的核......
  • JMM(java内存模型)
    一、概念JMM与java并发编程相关:1、抽象了线程与主内存的关系,例如线程的共享变量需要放到内存中进行读取2、规定了java源代码到CPU可执行指令这个转换过程中需要遵守的规范,例如防止指令重排序造成的并发问题 二、并发编程的三个特性1、原子性一次操作或者多次操作,要么所有......
  • 数据结构与算法分析(Java语言描述)(14)—— 索引堆
    packagecom.dataStructure.heap;importjava.util.Arrays;publicclassIndexMaxHeap{//最大索引堆中的数据privateInteger[]data;//最大索引堆中的索引privateint[]indexes;privateintcount;privateintcapacity;//构造函数,......
  • 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
    packagecom.algorithm.sort;publicclassHeapSortInPlace{privateHeapSortInPlace(){}publicstaticvoidsort(Integer[]arr){intn=arr.length;//注意:我们堆的索引是从0开始的//从(最后一个元素的索引-1)/2开始......