使用 SFrame 的矩阵乘法和使用 Graphlab and/or Numpy 的 SArray
Matrix multiplication with SFrame and SArray with Graphlab and/or Numpy
给定一个 graphlab.SArray
名为 coef
:
+-------------+----------------+
| 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,以便乘法 return 具有第一行的单个向量 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)
(错误) [out]:
[[ 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]]
我尝试的输出也是错误的,它应该 return 单个向量标量值。必须有更简单的方法来做到这一点。
如何操作 SArray 和 SFrame 以便乘法 return 具有第一行的单个向量 SArray,计算如下?
对于 numpy
数据帧,应该如何执行矩阵向量乘法?
我认为最好的办法是将 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
来完成,但除非你有大量数据,否则点积路线可能更简单。
要操作 SArray 和 SFrame 执行线性代数运算,您首先需要将它们转换为 Numpy 数组。确保您获得正确的尺寸和列顺序。
(我有 coef
SArray 和 features
SFrame,这正是你的 x
)
In [15]: coef = coef.to_numpy()
In [17]: features = features.to_numpy()
现在 coef
和 features
都是 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。你在机器学习专业吗?我也是,这就是为什么我知道这个:-)
给定一个 graphlab.SArray
名为 coef
:
+-------------+----------------+
| 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,以便乘法 return 具有第一行的单个向量 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)
(错误) [out]:
[[ 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]]
我尝试的输出也是错误的,它应该 return 单个向量标量值。必须有更简单的方法来做到这一点。
如何操作 SArray 和 SFrame 以便乘法 return 具有第一行的单个向量 SArray,计算如下?
对于 numpy
数据帧,应该如何执行矩阵向量乘法?
我认为最好的办法是将 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
来完成,但除非你有大量数据,否则点积路线可能更简单。
要操作 SArray 和 SFrame 执行线性代数运算,您首先需要将它们转换为 Numpy 数组。确保您获得正确的尺寸和列顺序。
(我有 coef
SArray 和 features
SFrame,这正是你的 x
)
In [15]: coef = coef.to_numpy()
In [17]: features = features.to_numpy()
现在 coef
和 features
都是 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。你在机器学习专业吗?我也是,这就是为什么我知道这个:-)