本文章接上一篇来实现预测算法,首先是简易平均法。请看代码:
package cn.netjava.simpleaverage;
import java.util.ArrayList;
import java.util.List;
public class SimpleTest {
/**
* 简易平均法
* 1.算术平均
* 2.几何平均
* 3.加权平均
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Float> ls=new ArrayList<Float>();//用来存入用户输入的原始数据
for(int i=0;i<6;i++){ //赋初值,以方便测试
float a=i;
ls.add(a);
}
List<Float> ls1=new ArrayList<Float>();//求加权平均时用来存入对应的权值
for(int j=0;j<6;j++){
float b=(float) (j*0.1);
ls1.add(b);
}
SimpleTest wp=new SimpleTest();
float ma= wp.mathAve(ls);
double ge=wp.geoAve(ls);
float we=wp.weightAve(ls, ls1);
System.out.println("算术平均值为"+ma);
System.out.println("几何平均值为"+ge);
System.out.println("加权平均值为"+we);
}
//算术平均值,把输入的数据存入一个队列中然后调用,返回这个队列中所有数据的平均值
private float mathAve(List<Float> ls){
float num=0; //求和
for(int i=0;i<ls.size();i++){
float a=ls.get(i);
num=num+a;
}
float ave=num/ls.size();
return ave;
}
//几何平均值,返回double型的值
private double geoAve(List<Float> ls){
float num=1; //求各个数据的积
for(int i=0;i<ls.size();i++){
float a=ls.get(i);
num=num*a;
}
System.out.println("num"+num);
double y=java.lang.StrictMath.pow(num,1.0/ls.size());//给积开n次方
return y;
}
//加权平均,用到了两个队列,一个用来存放原始数据,另一个用来存入对应的权值
private float weightAve(List<Float> ls,List<Float> ls1){
float a=0,w=0,num=0;//a为原始数据,w为权值
for(int i=0;i<ls.size();i++){
a=ls.get(i); //得到原始数据
}
for(int j=0;j<ls1.size();j++){
w=ls.get(j); //得到原始数据
}
num=num+a*w;
float Ave=num/ls.size();
return Ave;
}
}
这段代码运行结果如下:
算术平均值为2.5
几何平均值为0.0
加权平均值为4.1666665
:o ,几何平均值怎么会是0呢?不要着急,先喝一杯 :arrow: ,由于几何平均是先得到这组数据的积,再开n次方,而我们赋初值的时候第一个数是0,所以它们的积为0了,开方当然也就是0了。
由于下午有其它事要干,所以不能继续写下去了,不过我会尽快把后面的补上去,其实大家也看到了并没有我们想象中的那么难,我始终坚信,只有想不到,没有做不到,后面的算法相对来说实现起来相对复杂,不过没关系,我还是相信我都能搞出来并尽快和大家一起分享。
package cn.netjava.simpleaverage;
import java.util.ArrayList;
import java.util.List;
public class SimpleTest {
/**
* 简易平均法
* 1.算术平均
* 2.几何平均
* 3.加权平均
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Float> ls=new ArrayList<Float>();//用来存入用户输入的原始数据
for(int i=0;i<6;i++){ //赋初值,以方便测试
float a=i;
ls.add(a);
}
List<Float> ls1=new ArrayList<Float>();//求加权平均时用来存入对应的权值
for(int j=0;j<6;j++){
float b=(float) (j*0.1);
ls1.add(b);
}
SimpleTest wp=new SimpleTest();
float ma= wp.mathAve(ls);
double ge=wp.geoAve(ls);
float we=wp.weightAve(ls, ls1);
System.out.println("算术平均值为"+ma);
System.out.println("几何平均值为"+ge);
System.out.println("加权平均值为"+we);
}
//算术平均值,把输入的数据存入一个队列中然后调用,返回这个队列中所有数据的平均值
private float mathAve(List<Float> ls){
float num=0; //求和
for(int i=0;i<ls.size();i++){
float a=ls.get(i);
num=num+a;
}
float ave=num/ls.size();
return ave;
}
//几何平均值,返回double型的值
private double geoAve(List<Float> ls){
float num=1; //求各个数据的积
for(int i=0;i<ls.size();i++){
float a=ls.get(i);
num=num*a;
}
System.out.println("num"+num);
double y=java.lang.StrictMath.pow(num,1.0/ls.size());//给积开n次方
return y;
}
//加权平均,用到了两个队列,一个用来存放原始数据,另一个用来存入对应的权值
private float weightAve(List<Float> ls,List<Float> ls1){
float a=0,w=0,num=0;//a为原始数据,w为权值
for(int i=0;i<ls.size();i++){
a=ls.get(i); //得到原始数据
}
for(int j=0;j<ls1.size();j++){
w=ls.get(j); //得到原始数据
}
num=num+a*w;
float Ave=num/ls.size();
return Ave;
}
}
这段代码运行结果如下:
算术平均值为2.5
几何平均值为0.0
加权平均值为4.1666665
:o ,几何平均值怎么会是0呢?不要着急,先喝一杯 :arrow: ,由于几何平均是先得到这组数据的积,再开n次方,而我们赋初值的时候第一个数是0,所以它们的积为0了,开方当然也就是0了。
由于下午有其它事要干,所以不能继续写下去了,不过我会尽快把后面的补上去,其实大家也看到了并没有我们想象中的那么难,我始终坚信,只有想不到,没有做不到,后面的算法相对来说实现起来相对复杂,不过没关系,我还是相信我都能搞出来并尽快和大家一起分享。