JAVA Swing实现感知机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010992313/article/details/72726211

一、实现原理


感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取值+1或者-1。感知机对应于输入空间中将实例划分为正负两类的分离超平面,感知机学习旨在求出将训练数据正确分类的分离超平面。导入了基于误分类的损失函数,利用随机梯度下降法,对损失函数进行极小化,求得感知机模型。感知机学习算法具有原始形式和对偶形式,在本文中,我们使用对偶形式对训练数据处理。


Swing 是一个为Java设计的GUI工具包。Swing是JAVA基础类的一部分。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。


Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以在任意平台上使用JAVA支持的任意面板。轻量级组件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。 


在本文中,作者使用Java语言实现了感知机模型,并且使用swing工具包实现了感知机的可视化输入和结果处理,效果令人满意。

二、实现思路


使用JTextField实现输入数据,为JButton按钮添加ActionListener事件监听器执行相应的行为,并且把对应的事件监听器添加到相应的文本框中,使用JTextArea显示处理结果。

原始训练数据和对偶训练数据的事件监听器是整个程序的核心,也是数据挖掘知识部分。

手动输入需要处理的数据,因此首先确定维数以及训练数据个数,然后逐个输入。每一步都使相对应的组件处于可编辑或可使用状态,而其他组件处于不可编辑或不可食用状态,引到用户行为。

三、实现过程


(一)布局

首先,设想整个程序能够实现的功能:
  1. 输入特征空间的维数以及训练数据的个数;
  2. 输入训练数据  ;
  3. 输入学习率  ;
  4. 感知机学习算法的原始形式和对偶形式;
  5. 预测数据;
  6. 显示结果。
  7. 再把所要的控件以合理的顺序放置到窗体。

(二)初始化


标识名

类型

说明

xData

double[][]

存储训练数据的特征值

yData

double[]

存储训练数据的类型

dim

int

特征空间维数

num

int

训练数据个数

learn

double

学习率

alpha

double[]

对偶形式的 

w

double[]

原始形式的w向量

b

double

 中的b

gram

double[][]

对偶形式用到的gram矩阵

i_d

int

x的迭代器,判断为第i_d+1个特征

i_n

int

y的迭代器,判断为第i_n+1个训练数据

isPredict

boolean

判断是否为预测步骤

x

double[]

保存预测的x值

is2

boolean

判断是否为对偶形式训练数据



在构造函数中进行变量初始化,在进行组件状态初始化:由于我们根据组件是否可编辑和可执行来引到用户操作,所以只把每一步要进行操作组件设置成可编辑和可执行,具体是:JTextField 的 setEditable() 函数可以设置是否可编辑,JButton 的 setEnabled() 函数可以设置是否可执行。

 “清空”、“重置”按钮始终可用,目的是使用户随时能够重置程序状态以及清空输出窗口,以下步骤不会改变其状态,所以不再描述两按钮状态变化。

开始时,维数输入框以及“确定”按钮可用。

(三)程序逻辑


0.点击“重置”回到程序开始状态;点击“清空”,清空窗口已有内容。
1. 在维数输入框内输入维数,点击“确定”按钮或者回车,在窗口输出维数。
2.在组数输入框中输入组数,点击“确定”按钮或者回车,在窗口输出组数。
3.输入每一组训练数据的类型以及分量值,点击“添加”按钮或者回车,在窗口输出值。
4.输入学习率,点击“原始训练数据”或“对偶训练数据”按钮,在窗口输出结果。
5.点击“输入预测特征”,输入要预测的数据特征值,点击“预测”,在窗口输出结果。
(四)具体实现

为“添加”按钮添加事件监听器(AddListener),若为预测状态(isPredict),则将预测特征值添加到x数组;若是输入类别状态(yText.isEditable()),则将类别值输入到yData数组对应位置;若是输入特征状态(xText.isEditable()),则将特征值输入到xData数组对应位置。

为“确定”按钮添加事件监听器(OkListener),若为输入维数状态(dimText.isEditable()),则输入维数到dim变量;若为输入组数状态(numText.isEditable()),则输入组数到num变量,并且初始化程序所有的数组。

为“原始训练数据”和“对偶训练数据”按钮添加对应的事件监听器(TrainListener和Train2Listener),并且记录训练数据的形式(is2)。


原始形式代码:

learn = Double.parseDouble(str);
//原始形式,学习模型
boolean isPre = true;   //isPre判断是否存在误分类点
while(isPre)
{
    isPre = false;
    for(int i = 0; i < num; i++)
    {
        if(yData[i]*(multiply(w,xData[i])+b)<=0)
        {
            showText.append("误分类点为:  ("+(i+1)+")\t");
            //更新w,显示
            for(int k =0;k <dim;k++)
            {
                w[k] = w[k] + learn*yData[i]*xData[i][k];
                showText.append("w"+(k+1)+":    "+w[k]+"\t");
            }
            b +=learn*yData[i];
            showText.append("b:  "+b+"\n");
            isPre = true;
            break;
        }
    }
}

对偶形式代码:

learn = Double.parseDouble(str);
//初始化gram矩阵
for(int i = 0 ; i < num;i++)
{
    for(int j = 0;j < num;j++)
    {
        for(int k = 0; k < dim; k++)
        {
            gram[i][j] += xData[i][k]*xData[j][k];  
        }
    }
}
boolean isPre = true;   //isPre判断是否存在误分类点
while(isPre)
{
    isPre = false;
    for(int i = 0; i < num; i++)
    {
        double sum = 0;
        for(int j = 0;j < num; j++)
        {
            sum += alpha[j]*yData[j]*gram[j][i];
        }
        if(yData[i]*(sum+b)<=0)
        {
            showText.append("误分类点为:  ("+(i+1)+")\t");
            alpha[i] +=learn;
            for(int k = 0;k<num;k++)
            {
                showText.append("alpha"+(k+1)+":     "+alpha[k]+"\t");
            }
            b +=learn*yData[i];
            showText.append("b:  "+b+"\n");
            isPre = true;
            break;
        }
    }
}


为“输入预测特征”按钮添加事件监听器(InputListener),记录状态(isPredict)以及初始化状态。
为“预测”按钮添加事件监听器(PredictListener),根据训练数据形式选择相对应的预测行为。
为“重置”按钮和“清空”按钮添加事件监听器(ResetListener和CleanListener),并完成相应操作。

四、实现结果


训练数据集:正实例点:x1=(3,3)',x2=(4,3)' ;负实例点:x3=(1,1)' ,学习率为1  ,并预测x=(2,2)' 的类别。


原始形式:




预测:



对偶形式:



预测:



五、代码下载


Java感知机


六、参考资料


《统计学习方法》 李航 清华大学出版社



猜你喜欢

转载自blog.csdn.net/u010992313/article/details/72726211