2015-12-11 36 views
1

給出一個graphlab.SArray命名coef矩陣乘法與SFrame和SArray與Graphlab和/或numpy的

+-------------+----------------+ 
|  name |  value  | 
+-------------+----------------+ 
| (intercept) | 87910.0724924 | 
| sqft_living | 315.403440552 | 
| bedrooms | -65080.2155528 | 
| bathrooms | 6944.02019265 | 
+-------------+----------------+ 
[4 rows x 2 columns] 

和一個名爲xgraphlab.SFrame(下圖1 10所示):

+-------------+----------+-----------+-------------+ 
| sqft_living | bedrooms | bathrooms | (intercept) | 
+-------------+----------+-----------+-------------+ 
| 1430.0 | 3.0 | 1.0 |  1  | 
| 2950.0 | 4.0 | 3.0 |  1  | 
| 1710.0 | 3.0 | 2.0 |  1  | 
| 2320.0 | 3.0 | 2.5 |  1  | 
| 1090.0 | 3.0 | 1.0 |  1  | 
| 2620.0 | 4.0 | 2.5 |  1  | 
| 4220.0 | 4.0 | 2.25 |  1  | 
| 2250.0 | 4.0 | 2.5 |  1  | 
| 1260.0 | 3.0 | 1.75 |  1  | 
| 2750.0 | 4.0 | 2.0 |  1  | 
+-------------+----------+-----------+-------------+ 
[1000 rows x 4 columns] 

怎麼辦我操縱SArray和SFrame,這樣乘法將返回一個具有第一行的矢量SArray,計算如下?

87910.0724924 * 1 
+ 315.403440552 * 1430.0 
+ -65080.2155528 * 3.0 
+ 6944.02019265 * 1.0 
= 350640.36601600994 

我目前在做愚蠢的事情轉化SFrame/SArray成列表,然後將其轉換成numpy的陣列做np.multiply。即使轉換成numpy數組後,它也沒有給出正確的矩陣向量乘法。我目前的嘗試:

import numpy as np 
coef # as should in SArray above. 
x # as should in the SFrame above. 
intercept = list(x['(intercept)']) 
sqftliving = list(x['sqft_living']) 
bedrooms = list(x['bedrooms']) 
bathrooms = list(x['bathrooms']) 
x_new = np.column_stack((intercept, sqftliving, bedrooms, bathrooms)) 

coef_new = np.array(list(coef['value'])) 

np.multiply(coef_new, x_new) 

(錯)[出]:

[[ 87910.07249236 451026.91998949 -195240.64665846 6944.02019265] 
[ 87910.07249236 930440.14962867 -260320.86221128 20832.06057795] 
[ 87910.07249236 539339.88334408 -195240.64665846 13888.0403853 ] 
..., 
[ 87910.07249236 794816.67019127 -260320.86221128 17360.05048162] 
[ 87910.07249236 728581.94767533 -260320.86221128 17360.05048162] 
[ 87910.07249236 321711.50936313 -130160.43110564 5208.01514449]] 

我嘗試的輸出是錯的太多,它應該返回一個矢量的標量值。必須有一個更簡單的方法來做到這一點。

我該如何操作SArray和SFrame,使乘法運算返回一個具有第一行的矢量SArray,計算如下?

numpy數據幀,應該如何執行矩陣向量乘法?

回答

3

我認爲你最好的選擇是將SFrame和SArray轉換爲numpy數組,並使用numpy dot方法。

import graphlab 

sf = graphlab.SFrame({'a': [1., 2.], 'b': [3., 5.], 'c': [7., 11]}) 
sa = graphlab.SArray([1., 2., 3.]) 

X = sf.to_dataframe().values 
y = sa.to_numpy() 

ans = X.dot(y) 

我在這裏使用的數據比您所使用的數據簡單,但這也適用於您。我能看到的唯一複雜情況是,您必須確保SArray中的值與SFrame中的列的順序相同(在您的示例中,他們的不是)。

我認爲這也可以使用SFrame apply來完成,但除非您有大量數據,否則dot產品路線可能更簡單。

2

要操縱SArray和SFrame執行線性代數運算,首先需要將它們轉換爲Numpy Array。確保您獲得正確的維度和列順序。 (我有coef SArray和features SFrame這正是你的x

In [15]: coef = coef.to_numpy() 
In [17]: features = features.to_numpy() 

現在coeffeatures都是NumPy的陣列。所以,現在將它們相乘一樣簡單:

In [23]: prod = numpy.dot(features, coef) 
In [24]: print prod 

[ 350640.36601601 778861.42048755 445897.34956322 641765.45839626 
    243403.19622833 671306.27500907 1174215.7748441 554607.00200482 
    302229.79626666 708836.7121845 ] 

In [25]: prod.shape 
Out[25]: (10,) 

在numpy的multiply()*進行逐元素相乘。但是dot()執行矩陣乘法,這正是你所需要的。

除了你的輸出

[[ 87910.07249236 451026.91998949 -195240.64665846 6944.02019265] 
[ 87910.07249236 930440.14962867 -260320.86221128 20832.06057795] 
[ 87910.07249236 539339.88334408 -195240.64665846 13888.0403853 ] 
..., 
[ 87910.07249236 794816.67019127 -260320.86221128 17360.05048162] 
[ 87910.07249236 728581.94767533 -260320.86221128 17360.05048162] 
[ 87910.07249236 321711.50936313 -130160.43110564 5208.01514449]] 

是成功的一半錯。如果你現在各行中總結的值,你會得到你的第一個元素向量的:

In [26]: 87910.07249236 + 451026.91998949 + (-195240.64665846) + 6944.02019265 
Out[26]: 350640.3660160399 

dot()做這一切給你,所以你並不需要擔心。

P.S.你在機器學習專業嗎?我也是,這就是爲什麼我知道這一點:-)

+0

; P是啊,從coursera的華盛頓大學課程!我通過投入numpy做了它。 'predictions = [np.dot(row,weights)for feature_matrix]' – alvas

+0

這也是一個選項。祝你好運學習:-)課程非常有趣。 –