线性规划的代码实现

线性规划其实实现很简单, 关键就是theta的训练。下面是我的JAVA代码实现:

我用的训练集为:

1.0 2.0 1.5
2.0 3.5 3.4
-1.2 2.0 3.5
4.7 3.2 4.5
2.3 -2.5 5.4

下面是类与函数的实现:

  1 import java.io.BufferedReader;
  2 import java.io.File;
  3 import java.io.FileReader;
  4 import java.io.IOException;
  5
  6 /**
  7  * 线性回归
  8  * @author CassieRyu
  9  *批量梯度下降法
 10  */
 11 public class Linear {
 12
 13     private double[][] trainData;//训练数据集
 14     private int row; //训练集的行(样本数目)
 15     private int column; //训练集的列(特征数目+2)第一行是人为添加的x0, 最后一列为y值
 16
 17     private double[] theta; //参数theta向量
 18     private double alpha; //步长
 19     private int iteration; //迭代次数
 20
 21     //构造函数
 22     public Linear(String fileName, double alpha, int ite){
 23         int rowF= getRowFromFile(fileName);
 24         int columnF = getColumnFromFile(fileName);
 25
 26         row = rowF;
 27         column = columnF+1; //为了计算方便,加上x0那行
 28
 29         trainData = new double[row][column];
 30         loadTrainData(fileName);
 31
 32         this.alpha = alpha;
 33         this.iteration = ite;
 34
 35         theta = new double[column-1];//减去y对应的那行
 36         initializeTheta();//theta的初始化
 37
 38         trainedTheta();//训练后的theta值
 39     }
 40
 41     //返回训练集的样本数目row
 42     public int getRowFromFile(String fileName){
 43
 44         int count=0;
 45         File file = new File(fileName);
 46         BufferedReader br = null;
 47         try{
 48             br = new BufferedReader(new FileReader(file));
 49             String temp = null;
 50             while((temp = br.readLine())!=null){ //循环读取下一行
 51                 count++;
 52             }
 53         }catch(IOException e){
 54             e.printStackTrace();
 55         }finally{
 56             if(br!=null)
 57                 try{
 58                     br.close();
 59                 }catch(IOException e1){
 60
 61                 }
 62         }
 63
 64         return count;
 65     }
 66
 67     //返回训练集列数,不包含x0
 68     public int getColumnFromFile(String fileName){
 69
 70         int count=0;
 71         File file = new File(fileName);
 72         BufferedReader br = null;
 73         try{
 74             br = new BufferedReader(new FileReader(file));
 75             String temp = null;
 76             if((temp = br.readLine())!=null){
 77                 String [] tempStr = temp.split(" ");//用空格将列分开
 78                 count = tempStr.length;//数组长度为列的数目
 79             }
 80         }catch(IOException e){
 81             e.printStackTrace();
 82         }finally{
 83             if(br!=null)
 84                 try{
 85                     br.close();
 86                 }catch(IOException e1){
 87
 88                 }
 89         }
 90
 91         return count;
 92     }
 93
 94     //返回训练集
 95     public void loadTrainData(String fileName){
 96
 97         //初始化x0为1
 98         for(int i=0;i<row;i++)
 99             trainData[i][0]=1.0;
100
101         File file = new File(fileName);
102         BufferedReader br = null;
103         try{
104             br = new BufferedReader(new FileReader(file));
105             String temp = null;
106             int count=0;
107             while((temp = br.readLine())!=null){ //行循环
108                 String [] tempStr = temp.split(" ");//用空格将列分开
109
110                 for(int i=1;i<column;i++) //对每行的每列赋值,除第一列x0==1已赋值
111                     trainData[count][i] = Double.parseDouble(tempStr[i-1]);
112                 count++; //行号加1
113             }
114         }catch(IOException e){
115             e.printStackTrace();
116         }finally{
117             if(br!=null)
118                 try{
119                     br.close();
120                 }catch(IOException e1){
121
122                 }
123         }
124     }
125
126     //初始化theta的值
127     public void initializeTheta(){
128
129         for(int i=0;i<column-1;i++)
130             theta[i]=1.0;
131     }
132
133     //训练theta的值
134     public void trainedTheta(){
135
136         while((iteration--)>0){//迭代次数
137
138             //每迭代一次需带入新的theta值重新计算一次h(xi)-y(i)
139             double[] temp = new double[row];
140             temp=getDerivation(); //h(xi)-y(i)
141
142             for(int j=0;j<column-1;j++){//循环一次的复杂度为O(m),m为样本数目
143                 double []tep = new double[row];
144                 double result=0.0;
145                 for(int i=0;i<row;i++){
146                     tep[i] = temp[i]*trainData[i][j]; //(h(xi)-y(i))*X(ij)
147                     result+=tep[i];
148                 }
149                 theta[j]-= alpha*result;
150             }
151         }
152     }
153
154     //得到(theta(k)*X(ik)-Y(i))即(h(xj)-yj)
155     public double[] getDerivation(){
156
157         double [] deff = new double[row];
158
159         for(int i=0;i<row;i++){
160             double h = getHypothesisFunc(i);
161             deff[i]=h-trainData[i][column-1];
162         }
163         return deff;
164     }
165
166     //得到theta(k)*X(ik)
167     public double getHypothesisFunc(int i){ //i为具体的某一行
168
169         double result=0;
170         for(int k=0;k<column-1;k++){
171             result+=theta[k]*trainData[i][k];
172         }
173         return result;
174     }
175
176     //打印训练集
177     public void printTrainData(){
178
179         System.out.printf("\n训练集:\n");
180
181         for(int i=0;i<row;i++){
182             System.out.printf("第"+i+"行:");
183
184             for(int j=0;j<column;j++){
185                 System.out.printf(trainData[i][j]+" ");
186             }
187             System.out.printf("\n");
188         }
189         System.out.printf("\n");
190
191     }
192
193     //打印theta值
194     public void printTheta(){
195
196         System.out.printf("Theta集:\n");
197         for(int j=0;j<column-1;j++){
198             System.out.printf(theta[j]+" ");
199         }
200         System.out.printf("\n");
201     }
202
203     //预测过程,即将theta带入h函数
204     public double predict(double[] newData){
205
206         double h=0.0;
207         for(int i=0;i<column-1;i++){
208             h+=newData[i]*theta[i];
209         }
210         return h;
211     }
212 }

LinearRegression

根据模型进行测试:

命令行中的输入为:2.3 4.6

 1 public class LinearMain {
 2
 3     public static void main(String[] args){
 4
 5         String fileName = "C:\\Users\\CassieLiu\\Desktop\\train.txt";
 6         Linear lin = new Linear(fileName,0.005,100);
 7         lin.printTrainData();
 8         lin.printTheta();
 9
10         //进行预测,数值在命令行参数里面
11         int len = args.length;
12         if(len!=(lin.getColumnFromFile(fileName)-1)){ //测试数据没有y值
13             System.out.printf("请输入对应该模型的样本!\n");
14             return;
15         }
16         else{
17             double[] arg = new double[len+1];
18             arg[0]=1.0; //给x0赋值
19             for(int i=0;i<len;i++){
20                 arg[i+1] = Double.parseDouble(args[i]);
21             }
22
23             double result = lin.predict(arg);
24             System.out.printf("根据模型预测出的值为:"+result);
25         }
26
27
28     }
29 }

main

最后的输出结果为:

有不足之处请指出!

本文为博主原创博文,未经许可请勿转载!

时间: 2024-12-11 17:20:14

线性规划的代码实现的相关文章

蒙特卡罗(洛)模拟

title: 蒙特卡罗(洛)模拟 date: 2020-02-27 21:26:53 categories: 数学建模 tags: [ MATLAB, 模拟] mathjax: true 引例 布丰投针实验 法国数学家布丰(1707-1788)最早设计了投针试验. 这一方法的步骤是: 1) 取一张白纸,在上面画上许多条间距为a的平行线. 2) 取一根长度为l(l≤a) 的针,随机地向画有平行直线的纸上掷n次,观察针与直线相交的次数,记为m. 3)计算针与直线相交的概率. 18世纪,法国数学家布丰

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

单纯形法求解线性规划问题(C++实现代码)

1 单纯形法 (1) 单纯形法是解线性规划问题的一个重要方法. 其原理的基本框架为: 第一步:将LP线性规划变标准型,确定一个初始可行解(顶点). 第二步:对初始基可行解最优性判别,若最优,停止:否则转下一步. 第三步:从初始基可行解向相邻的基可行解(顶点)转换,且使目标值有所改善-目标函数值增加,重复第二和第三步直到找到最优解. (2) 用程序进行运算前,要将目标函数及约束方程变成标准形式. 于非标准形式须作如下变换: a) 目标函数为极小值min z=CX时,转换为max z=-CX形式:

用LaTeX写线性规划

线性规划由目标函数和若干约束构成,Latex中并没有直接的命令来写线性规划.简单的做法是使用\begin{eqnarray} … \end{eqnarray}命令,但eqnarray命令是使若干方程按照中间的二元关系符(如等号)垂直对齐的,而线性规划的约束条件上虽然有二元关系符,但约束条件后面往往还有量词符号,它们也需要垂直对齐.也就是说,线性规划中有不止一个位置需要垂直对齐.或者干脆使用\begin{array} …\end{array}命令,这样可以做到多个位置垂直对齐,但又遇到公式无法自动

Lingo求解线性规划问题

lingo是一个方便进行求解规划问题的软件,可以很快求出,写好代码后按照下图点击即可. 大致以下几种情况: !变量下界为0的简单线性规划; model: max=4*x1+3*x2; 5*x1+x2>10; x1+x2<8; x2<6; end !下界可以是任何值得简单线性规划; model: max=4*x1+3*x2; 5*x1+x2<14; x1+x2<18; x2<6; @free(x1);@free(x2); end !整数线性规划; model: max=4

【bzoj1061】[NOI2008]志愿者招募 线性规划与费用流

题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人.布布通过了解得知,一共有M 类志愿者可以招募.其中第i 类可以从第Si 天工作到第Ti 天,招募费用是每人Ci 元.新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募足够的志愿者,但这并不是他的特长!于是布布找到了你,希望你帮他设计一种最优的招募方案. 输入

线性规划与网络流10 餐巾计划问题

算法实现题 8-10 餐巾计划问题(习题 8-21)?问题描述:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分:或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天

BZOJ 3550 [ONTAK2010]Vacation 线性规划

题意:链接 方法:线性规划 解析: 这是一道蛮简单的单纯性线性规划. 首先我们设Xi表示第i个数是否选择. 则显然 X1+X2+...+Xn<=k X2+X3...+Xn+1<=k - X2n+1+X2n+2+...+X3n<=k 其次0<=Xi<=1 并且我们要最大化∑3ni=1Ci?Xi 观察如上式子,显然为标准型线性规划. 单纯性出解即OK. 代码: #include <cstdio> #include <cstring> #include &l

BZOJ 1061 [Noi2008]志愿者招募 线性规划

题意:链接 方法:线性规划 解析: 不妨对样例加以阐释 3 3 2 3 4 1 2 2 2 3 5 3 3 2 不妨设Xi代表第i种志愿者选Xi个人 那么显然,这题的限制为 X1>=2 X1+X2>=3 X2+X3>=4 而我们要做的是使2?X1+5?X2+2?X3最小化 且Xi>=0 但这显然没有基本可行解,那么就不能用单纯形搞了吗? 并不是 有一个强大的东西叫对偶原理 什么是对偶原理呢? 对于本人的代码 设矩阵a[i][j] 其中a[0][i]代表目标函数的系数 a[i][0]