随笔 - 2, 文章 - 0, 评论 - 20, 引用 - 0
数据加载中……

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

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

   大家都上网购买图书的时候一般都会上像 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已经出来了.

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

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

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

posted on 2008-05-20 09:53 沈逸 阅读(1998) 评论(12)  编辑 收藏

评论

#1楼    回复  引用  查看    

牛啊,学习了!
2008-05-20 10:05 | elwin.wang      

#2楼    回复  引用  查看    

线性回归的方法,不错.
2008-05-20 10:11 | aspnetx      

#3楼    回复  引用    

来,预测一下地震。
2008-05-20 10:30 | wfa [未注册用户]

#4楼    回复  引用  查看    

为啥是直线呢?这样预测出来的对吗?
2008-05-20 11:36 | 巫云      

#5楼    回复  引用    

线性回归才是王道。。。。
2008-05-20 12:03 | redelva [未注册用户]

#6楼    回复  引用  查看    

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

2.画个坐标图。x轴代表时间 y轴代表销量.我们可以看到一段时间内的数据点可以体现为直线

~~~~~~~~~~~~~~~~~~~~~~~~~·
1应该是个柱状或者饼图,那么2里面的横坐标是什么意思,是时间点,还是一个timespan?为什么又是直线的?
2008-05-20 13:55 | hoodlum1980      

#7楼    回复  引用  查看    

我们使用了一个很牛的概念叫作曲线拟合....囧啊.....
最简单的方法,直接把你的输入输出放到Matlab里面,建立一个BP网络,拟合一下就OK了,还自己写干啥....
2008-05-20 16:08 | yzlhccdec      

#8楼    回复  引用  查看    

不过现在做数据挖掘的用SVM比较多
2008-05-20 16:09 | yzlhccdec      

#9楼    回复  引用    

这叫挖掘?晕,这个是分析数据罢了!
不过里面的一些方法值得学习!
2008-05-20 17:01 | lifuyun [未注册用户]

#10楼    回复  引用  查看    

对于DM,我也很感兴趣,还望以后和您多多交流!
2008-05-20 19:51 | Indigo Dai      

#11楼    回复  引用  查看    

一会儿给大家整个excel版
2008-05-21 10:48 | 蛙蛙池塘      

#12楼    回复  引用    

其实就是关于数学的建模问题,用数学软件Matlab和Ligon都能很好的处理这种问题.
2008-05-21 14:21 | sharphard [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: