Java整合Weka做線性回歸的例子

2021-07-14 22:35:45 字數 2300 閱讀 6486

之前研究完分類的邏輯回歸,繼續搞一下線性回歸看看。線性回歸在資料探勘領域應也是非常常見,即根據現有的資料集(行向量組成的矩陣),(訓練)模擬出乙個合適的規律(函式),來推測任何新給出的資料組合(向量)應該得到的值。

具體的描述可以參見各種部落格,怎麼推導的看來看去一知半解,但總而言之結果也簡單,就是計算得到乙個「適當」的多元線性函式y=a0+a1*x1+a2*x2+a3*x3+…+ak*xk。我就不在這裡ctrl+v了。下面只看看**上如何整合。

weka中有對應的線性回歸linearregression。使用起來道理也一樣,就是先構造模型,然後使用;使用時就是構造乙個instance,然後用classifyinstance函式來得到**值。

訓練模型

static abstractclassifier trainmodel(string arfffile, int classindex) throws exception
我使用了ibm技術部落格上的乙個資料樣本(根據房子的面積、房間數、浴室數等,**房子的房價):

@relation house

@attribute housesize numeric

@attribute lotsize numeric

@attribute bedrooms numeric

@attribute granite numeric

@attribute bathroom numeric

@attribute sellingprice numeric

@data

3529,9191,6,0,0,205000

3247,10061,5,1,1,224900

4032,10150,5,0,1,197900

2397,14156,4,1,0,189900

2200,9600,4,0,1,195000

3536,19994,6,1,1,325000

2983,9365,5,0,1,230000

但有一點讓我比較困惑,就是如何構造乙個資料例項,用來作為模型**的引數(自變數向量)。因為classifyinstance函式,是接收乙個資料例項的(即自變數向量)weka.core.instance,而且搜尋看到人家是這樣構造的:

instance ins = new weka.core

.instance(numoffields);

但實際上這個根本編譯不過,找了原因:weka.core.instance是乙個inte***ce!(難道早期的版本instance是乙個可以例項化的類嗎?)

在weka api文件 找找,還是可以看到有其實現類的。

這樣一來,**就可以寫了:

用模型來**

public static void main(string args) throws exception
執行一下:

price: 131311.66927984258
感興趣看看這個模型是怎麼樣的,可以列印出模型求解出來的各個係數。

linearregression linear = new linearregression();

......

for (double coef : linear.coefficients())

執行一下看看,可以得到:

-26.688240074108368

7.055124244983151

43166.07667227803

0.042292.09008972738

0.0-21661.120845270096

有兩個係數是0,對應arff檔案可以得知,granite 是對結果沒有影響的。第二個0的係數,是不是對應了price**的位置,因為price是被**的因變數,所以係數也一定為0。

因此這個模型的解讀是:

sellingprice =

-26.6882 * housesize +

7.0551 * lotsize +

43166.0767 * bedrooms +

42292.0901 * bathroom +

-21661.1208

在Java中使用weka 入門

本文介紹如何使用weka構建特徵向量,訓練分類器,測試分類器,使用分類器。第一步 用特徵表達問題 屬性 這一步相當於構建乙個arff檔案 我們先把特徵放入weka.core.fastvector中 每個特徵都包含在weka.core.attribute類中 現在我們有兩個numeric 特徵,乙個 ...

Weka學習之用java構建ARFF檔案

arff是weka支援的檔案型別 我們可以通過讀取arff檔案獲取資料,進而執行weka進行資料的分析,但是由於某些需求的原因,我們需要連線資料庫對arff進行動態的新增,構建我們需要的instances 我們可以粗略的理解乙個instances對應乙個arff檔案,如下,如果不清楚arff檔案格式...

Springboot整合Redis做快取

redis安裝參考 redis安裝 linux修改redis配置檔案及防火牆的更改參考 linux防火牆更改 redis配置檔案修改 在專案中引入redis的包 org.springframework.boot groupid spring boot starter data redis artif...