Skip to main content
 首页 » 编程设计

python之使用 SFrame 和 SArray 与 Graphlab 和/或 Numpy 进行矩阵乘法

2025年05月04日14sky-heaven

给定一个名为 coef 的 graphlab.SArray:

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

还有一个名为 x 的 graphlab.SFrame(如下所示的前 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 Dataframes,应该如何执行矩阵向量乘法?

请您参考如下方法:

我认为最好的办法是将 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 来完成,但除非您有大量数据,否则点积路线可能更简单。