【问题标题】:Matrix multiplication with SFrame and SArray with Graphlab and/or Numpy矩阵乘法与 SFrame 和 SArray 与 Graphlab 和/或 Numpy
【发布时间】:2015-12-11 21:49:48
【问题描述】:

给定一个名为coefgraphlab.SArray

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

还有一个名为xgraphlab.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,应该如何执行矩阵向量乘法?

【问题讨论】:

    标签: python numpy matrix graphlab sframe


    【解决方案1】:

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

    【讨论】:

      【解决方案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 是的,来自 coursera 的华盛顿大学课程!我是通过转换成 numpy 来做到的。 predictions = [np.dot(row, weights) for row in feature_matrix]
      • 这也是一种选择。祝你学习顺利 :-) 这门课很有趣。
      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 2016-11-18
      • 2012-02-12
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      相关资源
      最近更新 更多