数据挖掘初探-用简单公式预测下月数据

最近在搞数据挖据。偶然看到有些功能可以应用到一些网站当中去.

   大家都上网购买图书的时候一般都会上像 dearbook,当当这样的国内专业购书网站。这些网站一般都会提供一个常用的功能叫做销售排名,用来向大家展现一段时间内图书销售的排名情况。一般都是展现当月的图书销量排名。这里我们其实可以加一个功能叫做“下个月销售排行榜”,这样可以增加用户体验和使用户购书的时候更具有针对性.  

   废话就不多说了。要完美的完成上述功能,需要大家实现以下2个功能点.

   1.对用户分类。即根据用户在网站上的行为特征对用户进行用户特征和喜好的分类。分类的数学模型很多。这些我使用神经网络。(不是本文重点,暂不详述)。

   2.根据用户分类。在“下月销售榜”中根据分类展现该分类中图书预测排名.  

  由于本文主要讲预测。针对于第一点就不描述了。  

  开门见山,进行做这个功能的准备活动.   

   1.首先要进行采样,把各个图书的历年或者历月的销售量记录在数据表中.  

    2.画个坐标图。x轴代表时间 y轴代表销量.我们可以看到一段时间内的数据点可以体现为直线     3.初中时我们就学过直线方程 y=ax+b (不要告诉我你没学过)  

    4.各个数据点的连接关系并不都是直线,而是形成一个散点图.  

    5.各个散点其实形成各个数据间的曲线关系。为了表现各个曲线所表示坐标之间的函数关系。我们使用了一个很牛的概念叫作曲线拟合.

    6.由于是曲线因此我们不能简单使用y=ax+b直线方程来搞定。原因在第4点.  

    7.根据我们所学的知识。我们认为各个曲线成线性关系,即数据与数据之间按比例、成直线的关系。在数学上可以理解为一阶导数为常数的函数。

    8.由于我们只要根据图书的销售时间和销售量来预测下月的销售量。我们把时间当作自变量X,销售量当作因量Y 结果就是x={2005, 2006, 2007, 2008}, y={222,223,224,225} 这里代表2005年某本书的销量是222本。。。。 我们要预测2009年这本书的销量是多少.

  9.于是方程式变形.依旧还是y=ax+b.只不过这里我们使用线性回归来近似估计值.注意这里使用了近似两个字.

   10.到这里思路清晰。由于是1元方程。于是我们使用一元线性回归来计算a和b的值。

 

     接下来是发放代码  java代码 拷贝到c#中一样用

 

public class OneDimLinear {
 
  
private double[][] datax;

public void setDatax(double[][] datax) {
 
this.datax = datax;
}


public double[][] getDatax() {
 
return datax;
}

public int getLength(){
 
return this.datax.length;
}

public double getAValue()  //获得自变量A的值
 {
   
if(!Validate())
    
return 0;
  
double szA1=(this.getLength()*this.getSumXY()-this.getSumX()*this.getSumY());
  
double szA2=this.getSumSquareX()-Math.pow(this.getSumX(), 2);
  
if(szA2>0)
  
{
   
return szA1/szA2;
  }

  
else
  
{
   
return 0;
  }

   
 }

public double getBValue(double AValue) //获得自变量B的值
{
 
if(!Validate())
    
return 0;
 
return this.getSumY()/this.getLength()-(AValue*this.getSumX())/this.getLength();
}

public double getLinearValue(double x) //根据自变量X 求因变量Y
{
 
if(!Validate())
    
return 0;
 
double szA=this.getAValue();
 
double szB=this.getBValue(szA);
 
return szA*x+szB;
}

 
public double getSumX()  //获得X值的和
 {
  
double szRes=0;
    
if(Validate())
    
{
     
for(int i=0;i<=this.datax.length-1;i++){
       szRes
+=this.datax[i][0];
     }

     
return szRes;
    }

    
else
       
return 0;
 }

 
public double getSumY()//获得Y值的和
 {
  
double szRes=0;
    
if(Validate())
    
{
     
for(int i=0;i<=this.datax.length-1;i++){
       szRes
+=this.datax[i][1];
     }

     
return szRes;
    }

    
else
       
return 0;
 }

 
public double getSumXY() //获得x*y的和
 {
  
double szRes=0;
     
if(Validate())
     
{
      
for(int i=0;i<=this.datax.length-1;i++){
        szRes
+=this.datax[i][0]*this.datax[i][1];
      }

      
return szRes;
     }

     
else
        
return 0;
 }

 
public double getSumSquareX() //获取X的平方和
 {
  
double szRes=0;
  
if(Validate())
  
{
   
for(int i=0;i<=this.datax.length-1;i++){
       szRes
+=java.lang.Math.pow(this.datax[i][0], 2);
     }

     
return szRes;
  }

  
else
   
return 0;
 }

 
private boolean Validate() //验证数据是否合法
 {
  
if(this.datax.length<=0)
   
return false;
  
if(this.datax[0].length!=2)
  
{
   
return false;
  }

  
return true;
 }

 
  
  

}


 

   根据上面2个类 ,我们可以把系数a和b都计算出来了。 于是根据y=ax+b 把x=2009放进去吧 y已经出来了.

   接下来要干的事情是把各个数据循环一遍 把每本书的下一个月的销量算出来。

   于是接下来的 这个“下个月销售量” 这个功能就做好了.

 

 由于上述是个简单的例子。代码没有进行性能优化,有兴趣的朋友可以拿回去优化。这里说明很多增加用户体验和东西都可以通过一些我们以前学过的简单的知识搭配起来。

 

欢迎猛戳我简陋的个人官网 www.shenyisyn.org

posted @ 2008-05-20 09:53  沈逸  阅读(4243)  评论(12编辑  收藏  举报