0

126 行と 5 列の数値でいっぱいの Excel ファイルがあります。そのデータと SVD メソッドを使用して、さらに 5 ~ 10 行のデータを予測する必要があります。numpy を使用して、Python で SVD を正常に実装しました。

numpy import genfromtxt から np として numpy をインポートする

my_data = genfromtxt('data.csv', delimiter=',')

U, s, V = np.linalg.svd(my_data)

print ("U:")
print (U)
print ("\nSigma:")
print (s)
print ("\nVT:")
print (V)

出力:

U:
[[-0.03339497  0.10018171  0.01013636 ..., -0.10076323 -0.09740801
  -0.08901366]
 [-0.02881809  0.0992715  -0.01239945 ..., -0.02920558 -0.04133748
  -0.06100236]
 [-0.02501102  0.10637736 -0.0528663  ..., -0.0885227  -0.05408083
  -0.01678337]
 ..., 
 [-0.02418483  0.10993637  0.05200962 ...,  0.9734676  -0.01866914
  -0.00870467]
 [-0.02944344  0.10238372  0.02009676 ..., -0.01948701  0.98455034
  -0.00975614]
 [-0.03109401  0.0973963  -0.0279125  ..., -0.01072974 -0.0109425
   0.98929811]]

Sigma:
[ 252943.48015512   74965.29844851   15170.76769244    4357.38062076
    3934.63212778]

VT:
[[-0.16143572 -0.22105626 -0.93558846 -0.14545156 -0.16908786]
 [ 0.5073101   0.40240734 -0.34460639  0.45443181  0.50541365]
 [-0.11561044  0.87141558 -0.07426656 -0.26914744 -0.38641073]
 [ 0.63320943 -0.09361249  0.00794671 -0.75788695  0.12580436]
 [-0.54977724  0.14516905 -0.01849291 -0.35426346  0.74217676]]

しかし、このデータを使用して自分の価値を予測する方法がわかりません。私はこのリンクhttp://datascientistinsights.com/2013/02/17/single-value-decomposition-a-golfers-tutotial/を参照として使用していますが、それは R にあります。最後に、R を使用して値を予測しますが、彼らはRでこのコマンドを使用します:

approxGolf_1 <- golfSVD$u[,1] %*% t(golfSVD$v[,1]) * golfSVD$d[1]

R コード全体への IdeOne リンクは次のとおりです: http://ideone.com/Yj3y6j

私はRにあまり詳しくないので、Pythonに上記のコマンドと同様の機能があるかどうか、またはそのコマンドが正確に何をしているのかを説明してもらえますか?

ありがとう。

4

1 に答える 1

1

あなたがリンクしたゴルフコースのサンプルデータを使用して、ステージを設定します。

import numpy as np
A=np.matrix((4,4,3,4,4,3,4,2,5,4,5,3,5,4,5,4,4,5,5,5,2,4,4,4,3,4,5))
A=A.reshape((3,9)).T

これにより、元の 9 行 3 列のテーブルが得られ、3 人用の 9 ホールのスコアが表示されます。

matrix([[4, 4, 5],
        [4, 5, 5],
        [3, 3, 2],
        [4, 5, 4],
        [4, 4, 4],
        [3, 5, 4],
        [4, 4, 3],
        [2, 4, 4],
        [5, 5, 5]])

次に、特異値分解:

U, s, V = np.linalg.svd(A)

調査すべき最も重要なことは、s特異値のベクトルです。

array([ 21.11673273,   2.0140035 ,   1.423864  ])

最初の値が他の値よりもはるかに大きいことを示しており、値が 1 つしかない対応する切り捨てられた SVDが元の行列をA非常によく表していることを示しています。この表現を計算するには、 の列 1 にUの最初の行をV掛け、最初の特異値を掛けます。これは、R で最後に引用されたコマンドが行うことです。これはPythonでも同じです:

U[:,0]*s[0]*V[0,:]

そして、これがこの製品の結果です:

matrix([[ 3.95411864,  4.64939923,  4.34718814],
        [ 4.28153222,  5.03438425,  4.70714912],
        [ 2.42985854,  2.85711772,  2.67140498],
        [ 3.97540054,  4.67442327,  4.37058562],
        [ 3.64798696,  4.28943826,  4.01062464],
        [ 3.69694905,  4.3470097 ,  4.06445393],
        [ 3.34185528,  3.92947728,  3.67406114],
        [ 3.09108399,  3.63461111,  3.39836128],
        [ 4.5599837 ,  5.36179782,  5.0132808 ]])

ベクトル要因U[:,0]とについてV[0,:]: 比喩的に言えば、プレーヤーの強さをエンコードしUながら、ホールの難しさの表現として見ることができます。V

于 2013-06-27T19:13:43.157 に答える