【沈逸 】利用回撥實現指令碼實體類和模擬Ajax

iDotNetSpace發表於2008-05-20
最近在搞資料挖據。偶然看到有些功能可以應用到一些網站當中去.

   大家都上網購買圖書的時候一般都會上像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;
 }

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-281035/,如需轉載,請註明出處,否則將追究法律責任。

相關文章