2012-07-18 80 views
4

我在做多元線性迴歸在Python(sklearn),但由於某些原因,該係數不正確返回一個列表。而是返回列表IN列表:線性迴歸()返回列表(sklearn)內列表

from sklearn import linear_model 
clf = linear_model.LinearRegression() 
# clf.fit ([[0, 0, 0], [1, 1, 1], [2, 2, 2]], [0, 1, 2]) 
clf.fit([[394, 3878, 13, 4, 0, 0],[384, 10175, 14, 4, 0, 0]],[3,9]) 
print 'coef array',clf.coef_ 
print 'length', len(clf.coef_) 
print 'getting value 0:', clf.coef_[0] 
print 'getting value 1:', clf.coef_[1] 

這將返回列表[[]]而不是列表[]的列表中的值。任何想法爲什麼發生這種情況?輸出:

coef array [[ 1.03428648e-03 9.54477167e-04 1.45135995e-07 0.00000000e+00 
0.00000000e+00 0.00000000e+00]] 
length 1 
getting value 0: [ 1.03428648e-03 9.54477167e-04 1.45135995e-07 0.0000000 
0e+00 0.00000000e+00 0.00000000e+00] 
getting value 1: 
Traceback (most recent call last): 
    File "regress.py", line 8, in <module> 
    print 'getting value 1:', clf.coef_[1] 
IndexError: index out of bounds 

但這個工程:

from sklearn import linear_model 
clf = linear_model.LinearRegression() 
clf.fit ([[0, 0, 0], [1, 1, 1], [2, 2, 2]], [0, 1, 2]) 
# clf.fit([[394, 3878, 13, 4, 0, 0],[384, 10175, 14, 4, 0, 0]],[3,9]) 
print 'coef array',clf.coef_ 
print 'length', len(clf.coef_) 
print 'getting value 0:', clf.coef_[0] 
print 'getting value 1:', clf.coef_[1] 

輸出:

coef array [ 0.33333333 0.33333333 0.33333333] 
length 3 
getting value 0: 0.333333333333 
getting value 1: 0.333333333333 
+1

我不是試圖讓sklearn工作彎曲。如果有另一個Python庫,將返回相關係數線性多元迴歸,我很想聽聽它... – Zach 2012-07-19 02:24:18

回答

-1

這個真沒有關於Python語言一個有效的問題;這對sklearn的開發者應該是一個問題。但是......如果你知道這是你的數據將被返回的格式,你可以只:

print 'getting value 0:', clf.coef_[0][0] 
print 'getting value 1:', clf.coef_[0][1] 
            ^^^ 
1

我從來沒有使用爲您指的是多元線性迴歸的模塊,所以我不知道爲什麼它正在發生。但如果你只是想解決你的問題,您可以拼合名單:

flat_list = clf.coef_[0] 

如果列表中可能有不止一個子表(並想將它們全部組合成一個平坦的列表),那麼你就可以使用更普遍的方式來壓平:

flat_list = [item for sublist in clf.coef_ for item in sublist] 

編輯:雖然從包的開發者真正的解釋/解決方案等,你可以依靠這樣一個解決方案:

if isinstance(clf.coef_[0], list): 
    clf.coef_ = clf.coef_[0] 

只有當其中有一個子列表時,纔會使列表變平。

+0

它不會在任何情況下發生的,這就是問題所在。我想知道如果我做錯了什麼。 – Zach 2012-07-18 20:45:20

+0

@Zach我看到...在看看文檔後,目前尚不清楚在所有的爲什麼'coef'有不同的佈局,這取決於你如何調用'配合()'。至少有這樣的可能性沒有記錄。您可以嘗試聯繫該支持項目的[support](http://scikit-learn.org/stable/support.html)。雖然你找不到這個_real_解決方案,你可以看看我的答案編輯。 – betabandido 2012-07-18 21:42:20

+0

感謝,這是一個很好的解決辦法 – Zach 2012-07-18 22:39:19

2

好像與scipy.linalg的問題。如果您追蹤呼叫鏈,它將首先進入https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/base.py#L218,然後到達https://github.com/scipy/scipy/blob/master/scipy/linalg/basic.py#L468的if語句。 if區分你的兩個測試用例。在第一種情況下m,n=2,6,第二種情況下你有m,n=3,3

+0

任何想法如何解決它?或者用python獲得多元線性迴歸的另一種方法? – Zach 2012-07-19 01:22:50

+0

您可以使用'clf.coef_.flatten()'將數組摺疊到一個維度。 – 2012-07-19 04:03:49