2015-12-11 37 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

这也是一个选项。祝你好运学习:-)课程非常有趣。 –