感知机学习算法Java实现

感知机学习算法Java实现。

Perceptron类用于实现感知机,

其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式;

perceptronAnother()方法用于实现感知机学习算法的对偶形式(此处仍有bug)。

import java.util.Scanner;

public class Perceptron {
    private static final int maxn = 1010;
    private static final int maxm = 101;
    private static double[][] x = new double[maxn][maxm];
    private static double[] y = new double[maxn];
    private static int N = 0;
    private static int M = 0;
    private static double phi = 0.1;

    private static double[] w = new double[maxm];
    private static double b = 0;

    private static double[] alpha = new double[maxn];
    private static double[][] G = new double[maxn][maxn];

    private static void perceptronOriginal() {
        for(int i=0;i<M;i++) w[i] = 0;
        b = 0;
        boolean ok = true;
        while(ok) {
            ok = false;
            for(int i=0;i<N;i++) {
                double tmp = 0;
                for(int j=0;j<M;j++) tmp += w[j] * x[i][j];
                tmp += b;
                if(tmp * y[i] <= 0) {
                    ok = true;
                    for(int j=0;j<M;j++) w[j] += phi * y[i] * x[i][j];
                    b += phi * y[i];
                }
            }
        }
    }

    private static void beforePerceptronAnother() {
        for(int i=0;i<N;i++)
            for(int j=i;j<N;j++)
                for(int k=0;k<M;k++)
                    G[i][j] = x[i][k] * x[j][k];
        for(int i=0;i<N;i++)
            for(int j=0;j<i;j++)
                G[i][j] = G[j][i];
    }

    public static void perceptronAnother() { // has bug
        beforePerceptronAnother();
        for(int i=0;i<N;i++) alpha[i] = 0;
        b = 0;
        boolean ok = true;
        while(ok) {
            ok = false;
            for(int i=0;i<N;i++) {
                double tmp = 0;
                for(int j=0;j<N;j++)
                    tmp += alpha[j] * y[j] * G[j][i];
                tmp += b;
                if(y[i] * tmp <= 0) {
                    ok = true;
                    alpha[i] += phi;
                    b += phi * y[i];
                    System.out.println("alpha[" + i + "]:" + alpha[i] + ",b:" + b);
                }
            }
        }
        phi *= 0.9;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("input N: ");
        N = in.nextInt();
        System.out.print("input M: ");
        M = in.nextInt();
        System.out.println("input x:");
        for(int i=0;i<N;i++)
            for(int j=0;j<M;j++)
                x[i][j] = in.nextDouble();
        System.out.println("input y(y={-1,+1}):");
        for(int i=0;i<N;i++)
            y[i] = in.nextDouble();
        System.out.println("perceptron original......");
        perceptronOriginal();
        for(int i=M-1;i>=0;i--)
            System.out.println("w" + i + ":" + w[i]);
        System.out.println("b:" + b);
        System.out.println("perceptron another......");
        perceptronAnother();
        for(int i=0;i<M;i++) w[i] = 0;
        for(int i=0;i<N;i++) {
            for(int j=0;j<M;j++) {
                w[j] += alpha[i] * y[i] * x[i][j];
            }
        }
        for(int i=M-1;i>=0;i--)
            System.out.println("w" + i + ":" + w[i]);
        System.out.println("b:" + b);
    }
}
时间: 2024-11-05 15:56:09

感知机学习算法Java实现的相关文章

感知机学习算法 python实现

参考李航<统计学习方法> 一开始的感知机章节,看着不太复杂就实现一下... 1 """ 2 感知机学习算法的原始形式 3 例2.1 4 """ 5 import numpy as np 6 7 class Perceptron: 8 def __init__(self,w,b,alpha): 9 self.w = w 10 self.b = b 11 self.alpha = alpha 12 13 def loss(self,x,y

机器学习(二):感知机学习算法

感知机是一种线性分类模型,属于判别模型 f(x)  = sign(wx+b) ;  f(x)∈{+1,-1}; 其中M为错分类点的集合M. 感知机学习算法是误分类驱动的,采用随机梯度下降法进行参数更新. w<-----w + γyixi b<-----b + γyi γ为学习率,反复迭代直到所有样本均分类正确. 总结: 输入:训练数据集T={(x1,y1),(x2,y2).....(xn,yn)},学习率γ∈[0,1] 输出:w,b 感知模型f(x) = sign(wx+b) (1)选取初值

感知机学习算法(PLA)

Perception Learning Algorithm, PLA 1.感知机 感知机是一种线性分类模型,属于判别模型. 感知机模型给出了由输入空间到输出空间的映射: f(X) = sign(WTX + b) 简单来说,就是找到一个分类超平面 WTX + b =0,将数据集中的正例和反例完全分开. 2.感知机学习算法(PLA) 感知机学习算法是为了找到 W 和 b  以确定分类超平面.为了减少符号,令 W = [b, W1, W2, ..., Wn], X = [1, X1, X2, ...,

《统计学习方法》之二:感知机学习算法

只有亲自用代码实现才算真正理解算法,有时候也要在不断的修改调试中理解,更何况只看不敲代码呢? 代码: % date : 2019/01/02 % author: Dufy % 关于感知机算法 % 输入: x1, x2数据点 % y 为分类,1为正,-1为负 close all; clc clear format compact i=0; a = -1; x1=[3 4 1]; x2= [3 3 1]; y = [1 1 -1]; n = length(x1); alpha = 1; w= [0

感知机学习算法

感知机原始形式 1 # coding:utf-8 2 import matplotlib.pyplot as plt 3 import numpy as np 4 5 def dataN(length):#生成数据 6 x=[[1,x/100.0,x/100.0+ (x%2)*1.5 + np.random.uniform(0,1.2)] for x in range(length)] 7 y=[(-1)**(y%2-1) for y in range(length)] 8 x=np.mat(x

吴裕雄 python 机器学习——人工神经网络感知机学习算法的应用

import numpy as np from matplotlib import pyplot as plt from sklearn import neighbors, datasets from matplotlib.colors import ListedColormap from sklearn.neural_network import MLPClassifier ## 加载数据集 np.random.seed(0) # 使用 scikit-learn 自带的 iris 数据集 ir

统计学习方法(第2章)感知机 学习笔记

第2章 感知机 感知机是二类分类的线性分类模型,其输入为实例的特征向量,感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型.导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型.感知机学习算法分为原始形式和对偶形式,是神经网络和支持向量机的基础. 1.感知机模型 感知机定义: 假设输入空间(特征空间)是X,输出空间是Y,Y的取值为+1和-1,输入x表示实例的特征向量,对应于输入空间(特征空间)的:输入y表示实例的类别.由输入空间到输出空间的如

Java基础学习总结——Java对象的序列化和反序列化

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

生成学习算法(Generative Learning algorithms)

一:引言 在前面我们谈论到的算法都是在给定x的情况下直接对p(y|x;Θ)进行建模.例如,逻辑回归利用hθ(x) = g(θTx)对p(y|x;Θ)建模. 现在考虑这样一个分类问题,我们想根据一些特征来区别动物是大象(y=1)还是狗(y=0).给定了这样一个训练集,逻辑回归或感知机算法要做的就是去找到一个决策边界,将大象和狗的样本分开来.但是如果换个思路,首先根据大象的特征来学习出一个大象的模型,然后根据狗的特征学习出狗的模型,最后对于一个新的样本,提取它的特征先放到大象的模型中求得是大象的概率