Java实现一元线性回归预测

1.给出一元线性回归预测模型

2.设定固定的显著性水平为0.95(0.05)【此时R0.95的临界值为0.576】,计算相关系数R,进行显著性检验
3.按照预测年份,在固定的置信水平0.95(0.05)【t0.025(9)= 2.262】,计算2002、2003、2004年的点估计值、区间估计值。

4.提取Excel表内容解析数据,解析结果再写入Excel表

 

Excel表  模型用数据 

序号xi

年份

水路货运量实际值yi

模型预测值

1

1991

1659

2

1992

1989

3

1993

2195

4

1994

2255

5

1995

2329

6

1996

2375

7

1997

2364

8

1998

2354

9

1999

2418

10

2000

2534

11

2001

2568

点估计值

区间估计值

12

2002

13

2003

14

2004

 

提取Excel表数据并进行一元线性回归分析的类:

AnalyzeData.Java

package xxhg;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import java.io.*;
import jxl.*;
import java.lang.Math;
import java.io.File; 
 

public class Window extends JFrame{
   JFrame f_major = new JFrame("商务智能与数据挖掘");
   JTabbedPane tp = new JTabbedPane();

   Font ft = new Font("Serif", Font.TRUETYPE_FONT, 18);
   Font ft1 = new Font("Serif", Font.ROMAN_BASELINE, 20);
   Font ft2 = new Font("Serif", Font.ROMAN_BASELINE, 15);
   Font ft3 = new Font("Serif", Font.TRUETYPE_FONT, 16);

   JPanel panel = new JPanel();
   //控件定义
   JLabel Hgfc_1=new JLabel("——————回归方程——————", JLabel.CENTER);
   JLabel Xgxjy_1=new JLabel("————相关性检验————", JLabel.CENTER);
   JLabel Xgxjy_2=new JLabel("显著性水平", JLabel.CENTER);
   JLabel Xgxjy_3=new JLabel("临界值R α=", JLabel.CENTER);
   JLabel Xgxjy_4=new JLabel("复相关系数  R=", JLabel.CENTER);
   JLabel Xgxjy_5=new JLabel("结  论", JLabel.CENTER);
   JLabel Ycsr_1=new JLabel("—————预测输入————", JLabel.CENTER);
   JLabel Ycsr_2=new JLabel("预测年份", JLabel.CENTER);
   JLabel Ycsr_3=new JLabel("置信水平", JLabel.CENTER);
   JLabel Ycsc_1=new JLabel("———————预测输出———————", JLabel.CENTER);
   JLabel Ycsc_2=new JLabel("预测结果:", JLabel.CENTER);
   JLabel Ycsc_3=new JLabel("预测区间:", JLabel.CENTER);
   JLabel Sjxsq_1=new JLabel("———————数据显示区———————", JLabel.CENTER);
   JButton Hgfc_b1=new JButton("显示");
   JButton Xgxjy_b1=new JButton("相关性检验");
   JButton Ycsr_b1=new JButton("预测分析");
   JButton Sjxsq_b1=new JButton("显示原始数据");
   JButton Cz_b=new JButton("重置");
   JTextField Hgfc_tf1=new JTextField(20);
   JTextField Xgxjy_tf1=new JTextField(10);
   JTextField Xgxjy_tf2=new JTextField(10);
   JTextField Ycsc_tf1=new JTextField(15);
   JTextField Ycsc_tf2=new JTextField(20);
   JTextArea Jl_ta=new JTextArea();
   JTable jTable = new   JTable();
   JComboBox Xgxjy_cb1=new JComboBox();
   JComboBox Ycsr_cb1=new JComboBox();
   JComboBox Ycsr_cb2=new JComboBox();
   
   double[] x;
   double[] y;
   double[] p;
   
   double x_a=0;
   double y_a=0;
   double xy=0;
   
   double b;
   double a;
   double Lxx;
   double Lyy;
   double Lxy;
   double R;
   int N;
   
   int x_p;
   int x_o;
   double y_p;
   double zxsp;
   
   
   public static void main(String[] args) {
     Window win = new Window();
     win.go();
   }
   
   
   public void go() {
    //窗体界面设计
     f_major.setSize(900,600);
     f_major.getContentPane().setLayout(new BorderLayout());
     f_major.getContentPane().add("Center", tp);//把选项卡容器放入窗体中心位置
 
     f_major.setFont(ft);
     f_major.setVisible(true);
     f_major.setResizable(true);
     //选项卡界面设计
     tp.add("一元线性回归", panel);
     tp.setFont(ft);
 
      //界面设计
       panel.setLayout(null);
       //回归方程界面
       Hgfc_1.setSize(350, 40);
       Hgfc_1.setLocation(450, 0);
       Hgfc_1.setFont(ft1);
       
       Hgfc_tf1.setSize(300, 30);
       Hgfc_tf1.setLocation(460,40);
       
       Hgfc_b1.setSize(70, 30);
       Hgfc_b1.setLocation(770,40);
       Hgfc_b1.setFont(ft2);
       //相关性检验界面
       Xgxjy_1.setSize(350, 40);
       Xgxjy_1.setLocation(450, 80);
       Xgxjy_1.setFont(ft1);
       
       Xgxjy_2.setSize(100, 40);
       Xgxjy_2.setLocation(445, 120);
       Xgxjy_2.setFont(ft2);
       
       Xgxjy_cb1.setSize(80, 20);
       Xgxjy_cb1.setLocation(550, 130);   
       Xgxjy_cb1.addItem("0.05");
  
       
       Xgxjy_3.setSize(100, 40);
       Xgxjy_3.setLocation(650,120 );
       Xgxjy_3.setFont(ft2);
       
       Xgxjy_tf1.setSize(80, 20);
       Xgxjy_tf1.setLocation(750, 130);
       if( Xgxjy_cb1.getSelectedItem()=="0.05")Xgxjy_tf1.setText("0.576");
      
       
       Xgxjy_4.setSize(150, 40);
       Xgxjy_4.setLocation(435, 160);
       Xgxjy_4.setFont(ft2);
       
       Xgxjy_tf2.setSize(150, 20);
       Xgxjy_tf2.setLocation(570, 170); 
       
       Xgxjy_5.setSize(100, 40);
       Xgxjy_5.setLocation(430,190 );
       Xgxjy_5.setFont(ft2);
       
       Jl_ta.setSize(280, 60);
       Jl_ta.setLocation(520, 200);
       
       //预测输入
       Ycsr_1.setSize(350, 40);
       Ycsr_1.setLocation(450, 260);
       Ycsr_1.setFont(ft1);
       
       Ycsr_2.setSize(100, 40);
       Ycsr_2.setLocation(440, 300);
       Ycsr_2.setFont(ft2);
       
       Ycsr_cb1.setSize(80, 20);
       Ycsr_cb1.setLocation(570, 310);   
       Ycsr_cb1.addItem("2002");
       Ycsr_cb1.addItem("2003");
       Ycsr_cb1.addItem("2004");
       
       Ycsr_3.setSize(100, 40);
       Ycsr_3.setLocation(440, 340);
       Ycsr_3.setFont(ft2);
       
       Ycsr_cb2.setSize(80, 20);
       Ycsr_cb2.setLocation(570, 350);   
       Ycsr_cb2.addItem("0.05");
       
       Ycsr_b1.setSize(100, 30);
       Ycsr_b1.setLocation(720, 325);
       Ycsr_b1.setFont(ft2);
       
       //预测输出
       Ycsc_1.setSize(350, 40);
       Ycsc_1.setLocation(450,380);
       Ycsc_1.setFont(ft1);
       
       Ycsc_2.setSize(100, 40);
       Ycsc_2.setLocation(450, 420);
       Ycsc_2.setFont(ft2);
       
       Ycsc_tf1.setSize(250, 30);
       Ycsc_tf1.setLocation(550, 425);
       
       Ycsc_3.setSize(100, 40);
       Ycsc_3.setLocation(450, 460);
       Ycsc_3.setFont(ft2);
       
       Ycsc_tf2.setSize(250, 30);
       Ycsc_tf2.setLocation(550, 465);
       
       Cz_b.setSize(120, 30);
       Cz_b.setLocation(20, 440);
       
       //数据显示区
       Sjxsq_1.setSize(350, 40);
       Sjxsq_1.setLocation(10, 0);
       Sjxsq_1.setFont(ft1);
      
       jTable.setSize(400, 350);
       jTable.setLocation(10, 40);
      
       Sjxsq_b1.setSize(120, 30);
       Sjxsq_b1.setLocation(20, 390);
       
       panel.add(Hgfc_1);
       panel.add(Hgfc_tf1);
       panel.add(Hgfc_b1);
       panel.add(Xgxjy_1);
       panel.add(Xgxjy_2);
       panel.add(Xgxjy_cb1);
       panel.add(Xgxjy_3);
       panel.add(Xgxjy_tf1);
       panel.add(Xgxjy_4);
       panel.add(Xgxjy_tf2);
       panel.add(Xgxjy_5);
       panel.add(Jl_ta);
       panel.add(Ycsr_1);
       panel.add(Ycsr_2);
       panel.add(Ycsr_3);
       panel.add(Ycsr_cb1);
       panel.add(Ycsr_cb2);
       panel.add(Ycsr_b1);
       panel.add(Ycsc_1);
       panel.add(Ycsc_2);
       panel.add(Ycsc_3);
       panel.add( Ycsc_tf1);
       panel.add( Ycsc_tf2);
       panel.add(Cz_b);
       panel.add( jTable);
       panel.add( Sjxsq_1);
       panel.add(Sjxsq_b1);
       //对命令按钮 Hgfc_b1设置监视器
       Hgfc_b1.addActionListener(new ShowEquation()) ;
       //对命令按钮 Hgfc_b1设置监视器
       Xgxjy_cb1.addActionListener(new Checkout() ) ;
       
       //对命令按钮 Ycsr_b1设置监视器
       Ycsr_b1.addActionListener(new Predict()) ;
       
       //对命令按钮Sjxsq_b1设置监视器
          Sjxsq_b1.addActionListener(new ShowData()) ;
       
    
   }
   //Showequation作为监视器的内部类
   class ShowEquation  implements ActionListener{
   @Override
   public void actionPerformed(ActionEvent arg0) {
    Hgfc_tf1.setText("Y="+a+b+"*X");
   }
   }
   // Checkout作为监视器的内部类
   class Checkout implements ActionListener{
   @Override
   public void actionPerformed(ActionEvent arg0) {
    R=Lxy/Math.sqrt(Lxx*Lyy);
    Xgxjy_tf2.setText(""+R);
    if(R>Double.parseDouble(Xgxjy_tf1.getText().trim()))
     Jl_ta.setText("复相关系数R大于Rα,相关性显著,通过检验");
    else
     Jl_ta.setText("复相关系数R不大于Rα,相关性不显著,不通过检验");
      
   }
   }
   
   //Predict作为监视器的内部类
   class Predict implements ActionListener{
   @Override
   public void actionPerformed(ActionEvent arg0) {
    x_p=Integer.parseInt(String.valueOf( Ycsr_cb1.getSelectedItem())); 
    zxsp=Double.parseDouble(String.valueOf( Ycsr_cb2.getSelectedItem()));
    y_p=a+b*(x_p-x_o);
    Ycsc_tf1.setText(""+y_p);
    double c,s;
    c=Math.sqrt((Lyy-b*Lxy)/(N-2));
    s=2.2622*c*(Math.sqrt(1+1/N+Math.pow((x_p-x_o-x_a), 2)/Lxx));
    Ycsc_tf2.setText("("+(y_p-s)+","+(y_p+s)+")");
   }
   }
   
  //ShowData作为监视器的内部类
   class ShowData  implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent arg0) {
   try    {  
     
    InputStream stream = new FileInputStream(new File("H:/xxhg/cargo_data.xls"));
   // 获取Excel文件对象
    Workbook rwb = Workbook.getWorkbook(stream);
    Cell cell = null;
    Sheet sheet = rwb.getSheet(0);
    DefaultTableModel tableModel=(DefaultTableModel) jTable.getModel();
    tableModel.setColumnCount(sheet.getColumns());
    tableModel.setRowCount(sheet.getRows());
    Object[] object=new Object[jTable.getColumnCount()];       
   // 获取文件的指定工作表 默认的第一个        
       System.out.println(tableModel.getRowCount());
       if(sheet.getRows()>2){
        x=new double[sheet.getRows()+1];
        y=new double[sheet.getRows()+1];
        for(int i=0;i<sheet.getRows();i++)
         {//列循环
         for(int j=0;j<sheet.getColumns();j++)
         {
          cell=sheet.getCell(j,i);
          if(cell.getType()==CellType.LABEL)
          { 
           LabelCell labelcell=(LabelCell)cell;
           object[j]=labelcell.getString();
           jTable.setValueAt(labelcell.getString(),i,j);             
            }
          else if(cell.getType()==CellType.NUMBER)
           {   
           Double numd;
           int numi;
           NumberCell numc10=(NumberCell)cell;
           numd=new Double(numc10.getValue());
           numi=numd.intValue();
           object[j]=numi;
           jTable.setValueAt(numi,i,j);
           if(i==1&&j==1)
           x_o=numi;
           if(j==1)
           x[i]=numi-x_o+1;
           x_a=x_a+x[i];
           if(j==2)
           y[i]=numi;
           y_a=y_a+y[i];
           xy=xy+x[i]*y[i];
             }
           }
           }
          N=sheet.getRows()+1;
          x_a=x_a/N;
          y_a=y_a/N;
          for(int i=1;i<N;i++)
          {
           Lxx=Lxx+Math.pow(x[i]-x_a,2);
           Lyy=Lyy+Math.pow(y[i]-y_a,2);
          }
          Lxy=xy-N*x_a*y_a;
          b=Lxy/Lxx;
          a=y_a-b*x_a;
                    }
               rwb.close(); 
              
              
         }   
            catch  (Exception e)  
            {  
             System.out.println(e);  
             }   
    } 
   }}

将解析结果写入Excel文档的类:

ExcelHandle.Java

package xxhg;
import jxl.*;   
import jxl.format.UnderlineStyle;   
import jxl.write.*;   
import jxl.write.Number;   
import jxl.write.Boolean;  
import java.io.*;   
  
/**  
* Created by IntelliJ IDEA.  
* User: xl  
* Date: 2005-7-17  
* Time: 9:33:22  
* To change this template use File | Settings | File Templates.  
*/   
public class ExcelHandle   
{   
public ExcelHandle()   
{   
}   
  
/**  
* 读取Excel  
*  
* @param filePath  
*/   
public static void readExcel(String filePath)   
{   
try   
{   
InputStream is = new FileInputStream(filePath);   
Workbook rwb = Workbook.getWorkbook(is);   
//Sheet st = rwb.getSheet("0")这里有两种方法获取sheet表,1为名字,而为下标,从0开始   
Sheet st = rwb.getSheet("original");   
Cell c00 = st.getCell(0,0);   
//通用的获取cell值的方式,返回字符串   
String strc00 = c00.getContents();   
//获得cell具体类型值的方式   
if(c00.getType() == CellType.LABEL)   
{   
LabelCell labelc00 = (LabelCell)c00;   
strc00 = labelc00.getString();   
}   
//输出   
System.out.println(strc00);   
//关闭   
rwb.close();   
}   
catch(Exception e)   
{   
e.printStackTrace();   
}   
}   
  
/**  
* 输出Excel  
*  
* @param os  
*/   
public static void writeExcel(OutputStream os)   
{   
try   
{   
WritableWorkbook wwb = Workbook.createWorkbook(os);   
//创建Excel工作表 指定名称和位置   
WritableSheet ws = wwb.createSheet("Test Sheet 1",0);   

Label label = new Label(0,0,"this is a label test");   
ws.addCell(label);       
WritableFont wf = new WritableFont(WritableFont.TIMES,18,WritableFont.BOLD,true);   
WritableCellFormat wcf = new WritableCellFormat(wf);   
Label labelcf = new Label(1,0,"this is a label test",wcf);   
ws.addCell(labelcf);      
WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD,false,   
UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED);   
WritableCellFormat wcfFC = new WritableCellFormat(wfc);   
Label labelCF = new Label(1,0,"This is a Label Cell",wcfFC);   
ws.addCell(labelCF);     
Number labelN = new Number(0,1,3.1415926);   
ws.addCell(labelN);     

NumberFormat nf = new NumberFormat("#.##");   
WritableCellFormat wcfN = new WritableCellFormat(nf);   
Number labelNF = new jxl.write.Number(1,1,3.1415926,wcfN);   
ws.addCell(labelNF);     
Boolean labelB = new jxl.write.Boolean(0,2,false);   
ws.addCell(labelB);    
jxl.write.DateTime labelDT = new jxl.write.DateTime(0,3,new java.util.Date());   
ws.addCell(labelDT);    
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");   
WritableCellFormat wcfDF = new WritableCellFormat(df);   
DateTime labelDTF = new DateTime(1,3,new java.util.Date(),wcfDF);   
ws.addCell(labelDTF);     
File image = new File("f:\\2.png");   
WritableImage wimage = new WritableImage(0,1,2,2,image);   
ws.addImage(wimage);   
//写入工作表   
wwb.write();   
wwb.close();   
}   
catch(Exception e)   
{   
e.printStackTrace();   
}   
}   
public static void modifyExcel(File file1,File file2)   
{   
try   
{   
Workbook rwb = Workbook.getWorkbook(file1);   
WritableWorkbook wwb = Workbook.createWorkbook(file2,rwb);//copy   
WritableSheet ws = wwb.getSheet(0);   
WritableCell wc = ws.getWritableCell(0,0);   
//判断单元格的类型,做出相应的转换   
if(wc.getType() == CellType.LABEL)   
{   
Label label = (Label)wc;   
label.setString("The value has been modified");   
}   
wwb.write();   
wwb.close();   
rwb.close();   
}   
catch(Exception e)   
{   
e.printStackTrace();   
}   
}   

public static void main(String[] args)   
{   
try   
{   
//读Excel   
ExcelHandle.readExcel("f:/testRead.xls");   
//输出Excel   
File fileWrite = new File("f:/testWrite.xls");   
fileWrite.createNewFile();   
OutputStream os = new FileOutputStream(fileWrite);   
ExcelHandle.writeExcel(os);   
//修改Excel   
ExcelHandle.modifyExcel(new File(""),new File(""));   
}   
catch(Exception e)   
{   
e.printStackTrace();   
}   
}   
}

 

你可能感兴趣的:(java,预测,一元线性回归)