1

graphlab.SArray名前付きのcoef:

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

そして、graphlab.SFrame(最初の 10 の下に示されている) という名前x:

+-------------+----------+-----------+-------------+
| 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 を返すように、SArray と SFrame を操作するにはどうすればよいですか? :

   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]]

私の試みの出力も間違っています。単一のベクトルスカラー値を返す必要があります。もっと簡単にできる方法があるはずです。

乗算が以下のように計算された最初の行を持つ単一のベクトル SArray を返すように、SArray と SFrame を操作するにはどうすればよいですか?

また、numpyデータフレームでは、行列とベクトルの乗算をどのように実行する必要がありますか?

4

2 に答える 2

4

あなたの最善の策は、SFrame と SArray の両方を numpy 配列に変換し、numpydotメソッドを使用することだと思います。

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ますが、大量のデータがない限り、内積ルートの方がおそらく簡単です。

于 2015-12-12T01:32:22.213 に答える
2

SArray と SFrame を操作して線形代数演算を実行するには、まずそれらを Numpy Array に変換する必要があります。正しいディメンションと列の順序を取得していることを確認してください。(私はまさにあなたのcoefSArray とSFrame を持っています)featuresx

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

coefとはどちらもNumpyfeatures配列です。したがって、それらを乗算するのは次のように簡単です。

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,)

Numpymultiply()*、要素ごとの乗算を実行します。しかし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()これらはすべて自動的に行われるため、心配する必要はありません。

PS 機械学習の専門分野ですか? 私も、それが私がこれを知っている理由です:-)

于 2015-12-22T13:19:41.697 に答える