このハウツーでは、gotaを使用してデータフレームからテンソルを作成する方法を説明します。
The goal is to read a csv file and create a *tensor.Dense
with shape (2,2).
ゴールは、csvファイルを読み取り、(2,2) のシェイプの* tensor.Dense
を作成することです。
以下のコンテンツのcsvファイルを考えます:
sepal_length,sepal_width,petal_length,petal_width,species
5.1 ,3.5 ,1.4 ,0.2 ,setosa
4.9 ,3.0 ,1.4 ,0.2 ,setosa
4.7 ,3.2 ,1.3 ,0.2 ,setosa
4.6 ,3.1 ,1.5 ,0.2 ,setosa
5.0 ,3.6 ,1.4 ,0.2 ,setosa
...
これはIris flower data setからの抜粋です。 データセットのコピーはここから見つける事ができます。
種別以外のすべての値を含むテンソルを作成します。
gotaのデータフレームパッケージにはio.Readerを引数として取る関数ReadCSV
があります。
f, err := os.Open("iris.csv")
if err != nil {
log.Fatal(err)
}
defer f.Close()
df := dataframe.ReadCSV(f)
df
がファイルに存在する全てのデータが含まれるDataFrame
です。
gotaはデータフレームの列を参照する為にCSVの最初の行を使用します。
種別(species)カラムを削除しましょう:
xDF := df.Drop("species")
物事を簡単にするために、データフレームをgonumで定義されているMatrix
に変換します(matrixのgodocを参照)。
matrix
はインタフェースです。gotaのデータフレームはMatrix
インターフェイスを満たしません。gotaのドキュメントに記載されているように、
Matrix
インターフェイスを満たすために、データフレームのラッパーを作成します。
type matrix struct {
dataframe.DataFrame
}
func (m matrix) At(i, j int) float64 {
return m.Elem(i, j).Float()
}
func (m matrix) T() mat.Matrix {
return mat.Transpose{Matrix: m}
}
データフレームをmatrix
構造体の中にラッピングすると関数tensor.FromMat64
のおかげで*Dense
テンソルを作成できるようになります。
xT := tensor.FromMat64(mat.DenseCopyOf(&matrix{xDF}))