[C#]行列計算のクラスライブラリMatrixSharpを作成しました。
はじめに
これまで行列積の計算速度を向上するために、いくつかの手法を試してみました。
学んできたことを昇華するにはアウトプットすることが大事なので、クラスライブラリを作成してGitHubに上げました。
この記事では、私が作成したライブラリを紹介します。
クラス構造
2次元配列double[,]
を行列Matrix
に、1次元配列double[]
を列ベクトルColumnVector
や行ベクトルRowVector
に変換して使用できるパッケージです。
列ベクトルと行ベクトルとを明示的に分けている理由は、手計算に近い感覚で使用するためです。
バージョン管理
ver 0.0.10
Modified the connection between public multiply method and internal function.
変更履歴
ver 0.0.9
Modified the algorithm to solve homogeneous equation.
Don't worry any user does NOT need to modify your code.
ver 0.0.8
Modify README
ver 0.0.7
Append internal function of faster matrix subtract.
If your matrix element number (row x column) is multiples of 2, 3, or 4, 5, your calculation will be faster than usual.
ver 0.0.6
Modify Clone Method of Matrix and Vector classes.
ver.0.0.5
Append internal function faster matrix addition. If your matrix element number (row x column) is multiples of 2, 3, or 4, 5, you are able to calculate matrix addition quickly.
ver.0.0.4 2023年1月21日
NugetのReadMeが文字化けしてしまったので、英語に直しました。
文字化け対策がまとまった後に、日本語も書きたいと思います。
ver.0.0.3 2023年1月21日
配列を返すToArrayメソッドを追加しました。
入出力の基本的な機能が揃いました。
ver.0.0.2 2023年1月15日
①ファイル名の変更(Userには影響なし)
②一部のコンストラクタのアクセス修飾子をinternalに変更
③線形回帰の予測メソッドの追加
ver.0.0.1 2023年1月12日
初版を発行しました。
クラス設計の概要
行列やベクトルの計算を行う基本クラスと、線形回帰などの応用クラスの2分類で設計しました。
管理が大変なので、今のところ名前空間はTremendous1192.SelfEmployed.MatrixSharp
だけにしています。
基本クラス(Basic)
行列やベクトルのクラスと、いくつかのinterfaceを基本クラスとしました。
名前空間 | クラス名 | 説明 |
---|---|---|
Tremendous1192.SelfEmployed.MatrixSharp | Matrix | 行列計算のクラス |
ColumnVector | 列ベクトルのクラス | |
RowVector | 行ベクトルのクラス | |
Vector | (アクセス修飾子internal)行ベクトルと列ベクトルの内部関数 | |
IRandomNumber | 乱数を生成するinterface | |
IKernel | カーネル法のカーネルを計算するinteface | |
IGraphLaplacian | グラフラプラシアンを計算するinterface |
応用クラス(Applied)
応用クラスは、線形回帰などの応用数学を行うクラスで構成されています。
名前空間 | クラス名 | 説明 |
---|---|---|
Tremendous1192.SelfEmployed.MatrixSharp | DesignMatrix | 計画行列 |
GaussianProcessRegression | ガウス過程回帰 | |
LinearRegression | 線形回帰 | |
LogisticRegression | ロジスティック回帰 | |
Preprocessing | 前処理 | |
PrincipalComponentAnalysis | 主成分分析 | |
SpectralClustering | スペクトルクラスタリング | |
KMeansClustering | k-平均法 |
基本クラス(Basic)の説明
Matrix
行列のクラスです。できるだけ数学の手計算に寄せてみました。
コンストラクタ
2次元配列を行列に変換します。
public Matrix(in double[,] array)
また、行数、列数を指定して零行列を作成できます。
public Matrix(int row, int column)
特に、正方行列の場合は引数は1つだけで大丈夫です。
public Matrix(int rowandColumn)
プロパティ
行列の要素の取得と上書きを行えます。
public double this[int i, int j]
行列の行数と列数のプロパティは読み取り専用です。
public int Row
public int Column
メソッド
ファイル名順に紹介します。
Add
行列の足し算を演算子のオーバーロードとして定義しました。
public static Matrix operator +(in Matrix left, in Matrix right)
Clone
行列を複製する
public Matrix Clone()
EigenValues
固有値を計算します。orderByAbs
がTrue
のときに絶対値の降順に返します。
public double[] EigenValues(int numberOfEigenValues, bool orderByAbs)
EigenVectors
固有ベクトルを計算します。orderByAbs
がTrue
のときに、固有値の絶対値の降順に対応する固有ベクトルの集合を返します。
public List<ColumnVector> EigenVectors(int numberOfEigenValues, bool orderByAbs)
HadamardProduct
行列のアダマール積
public Matrix HadamardProduct(in Matrix right)
Inverse
逆行列を計算する。
public Matrix Inverse()
Multiply
行列の掛け算を演算子のオーバーロードとして定義しました。
public static Matrix operator *(in Matrix left, in Matrix right)
PickUpColumnVector
列ベクトルを取得する。
public ColumnVector PickUpColumnVector(int column)
PickUpRowVector
行ベクトルを取得する。
public RowVector PickUpRowVector(int row)
Subtract
行列の引き算を演算子のオーバーロードとして定義しました。
public static Matrix operator -(in Matrix left, in Matrix right)
Transpose
転置行列を計算します。
public Matrix Transpose()
ColumnVector
コンストラクタ
1次元配列を行列に変換します。
public ColumnVector(double[] array)
また、ベクトルの次元を指定して零ベクトルを作成できます。
public ColumnVector(int dimension)
プロパティ
ベクトルの要素の取得と上書きを行えます。
public double this[int i]
ベクトルの次元のプロパティは読み取り専用です。
public int Dimension
メソッド
ファイル名順に紹介します。
Add
行列の足し算を演算子のオーバーロードとして定義しました。
public static ColumnVector operator +(in ColumnVector left, in ColumnVector right)
Clone
オブジェクトを複製します。
public ColumnVector Clone()
DotProduct
ベクトルの内積を計算します。
public double DotProduct(in ColumnVector right)
HadamardProduct
ベクトルール積
public ColumnVector HadamardProduct(in ColumnVector right)
Subtract
ベクトルの引き算を演算子のオーバーロードとして定義しました。
public static ColumnVector operator -(in ColumnVector left, in ColumnVector right)
Transpose
ベクトルの転置を計算します。
public RowVector Transpose()
UnitVector
単位ベクトルを計算します。
public ColumnVector UnitVector()
RowVector
コンストラクタ
1次元配列を行列に変換します。
public RowVector(double[] array)
また、ベクトルの次元を指定して零ベクトルを作成できます。
public RowVector(int dimension)
プロパティ
ベクトルの要素の取得と上書きを行えます。
public double this[int i]
ベクトルの次元のプロパティは読み取り専用です。
public int Dimension
メソッド
ファイル名順に紹介します。
Add
行列の足し算を演算子のオーバーロードとして定義しました。
public static RowVector operator +(in RowVector left, in RowVector right)
Clone
オブジェクトを複製します。
public RowVector Clone()
DotProduct
ベクトルの内積を計算します。
public double DotProduct(in RowVector right)
HadamardProduct
ベクトルール積
public RowVector HadamardProduct(in RowVector right)
Subtract
ベクトルの引き算を演算子のオーバーロードとして定義しました。
public static RowVector operator -(in RowVector left, in RowVector right)
Transpose
ベクトルの転置を計算します。
public ColumnVector Transpose()
UnitVector
単位ベクトルを計算します。
public RowVector UnitVector()
行列とベクトルの積
行列と列ベクトルの積
列ベクトルと行ベクトルの積(演算子)
public static Matrix operator *(in ColumnVector columnVectorMultiplicand, in RowVector rowVectorMultiplier)
行列と列ベクトルの積(演算子)
public static ColumnVector operator *(in Matrix matrixMultiplicand, in ColumnVector columnVectorMultiplier)
行ベクトルと列ベクトルの積(演算子)
public static double operator *(in RowVector rowVectorMultiplicand, in ColumnVector columnVectorMultiplier)
列ベクトルのスカラー倍(演算子)
public static ColumnVector operator *(double scalar, ColumnVector vector)
public static ColumnVector operator *(ColumnVector vector, double scalar)
行列のスカラー倍(演算子)
public static Matrix operator *(double scalar, Matrix matrix)
public static Matrix operator *(Matrix matrix, double scalar)
行ベクトルのスカラー倍(演算子)
public static RowVector operator *(double scalar, RowVector vector)
public static RowVector operator *(RowVector vector, double scalar)
IRandomNumber
疑似乱数を生成するインターフェースです。
周期
共通メソッド
乱数の種の上書きと読み取りメソッド。
void SetSeeds(uint[] setSeeds);
uint[] GetSeeds();
パラメータの上書きと読み取りはメソッドにしました。
プロパティで配列を読み取ると、上書きされてしまう危険性があるらしいので、メソッドにしました。
void SetSeeds(uint[] setSeeds);
uint[] GetSeeds();
乱数を生成するメソッドです。
変数1個だけの場合と、配列で返す場合の3種類用意しました。
double NextDouble();
double[] NextDoubles(int length);
double[,] NextDoubles(int length0, int length1);
派生クラス
コーシー分布のクラス
CauchyDistribution
指数分布のクラス
ExponentialDistribution
対数正規分布のクラス
LogNormalDistribution
正規分布のクラス
NormalDistribution
一様分布のクラス
UniformDistribution
IKernel
サポートベクトルマシンやガウス過程回帰で使用するためのカーネル関数のインターフェースです。
共通メソッド
ハイパーパラメータの設定と読み取りメソッドです。
void SetHyperParameters(double[] hyperParameter);
int HyperParameterDimension();
カーネル関数を計算するメソッドを用途別に用意しました。
基本的には下記の関数を使用してください。
double Kernel(RowVector vector01, RowVector vector02);
自分自身とのカーネル関数は計算量が少ない場合が多いので、別の関数として定義しました。
double KernelOneself(RowVector vector01);
ColumnVector KernelOneself(Matrix designMatrixTest);
訓練データのグラム行列を計算する。
Matrix GramMatrixTrain(Matrix designMatrixTrain);
テストデータのグラム行列を計算する。
Matrix GramMatrixTest(Matrix designMatrixTest, Matrix designMatrixTrain);
RowVector GramVectorTest(RowVector rowVectorTest, Matrix designMatrixTrain);
派生クラス
今のところガウシアンカーネルのみ定義しています。
GaussianKernel
IGraphLaplacian
スペクトルクラスタリングで使用するグラフラプラシアンのインターフェースです。
共通メソッド
ハイパーパラメータの設定と読み取りメソッドです。
void SetHyperParameters(double[] hyperParameter);
int HyperParameterDimension();
グラフラプラシアンに用いる3種類の行列のメソッドを書きました。
Matrix AdjacencyMatrix(Matrix designMatrix);
Matrix DegreeMatrix(Matrix designMatrix);
Matrix LaplacianMatrix(Matrix designMatrix);
派生クラス
今のところガウシアンのみ定義しています。
GaussianGraphLaplacian
応用クラス(Applied)の説明
DesignMatrix
計画行列の計算を行う静的クラスです。
メソッド
public static Matrix CorelationMatrix(Matrix designMatrix)
public static Matrix InverseVarianceCovarianceMatrix(Matrix designMatrix)
public static RowVector Mean(Matrix designMatrix)
ublic static double Mean(ColumnVector measuredVariables)
public static RowVector StandardDeviation(Matrix designMatrix)
public static double StandardDeviation(ColumnVector measuredVariables)
public static Matrix VarianceCovarianceMatrix(Matrix designMatrix)
GaussianProcessRegression
ガウス過程回帰の計算を行う静的クラスです。
メソッド
public static Matrix Learn(Matrix trainingDesignMatrix, IKernel iKernel, double[] hyperParameters, double noiseLambda = 0)
public static List<double> Predict(Matrix trainingDesignMatrix, IKernel iKernel, double[] hyperParameters, ColumnVector trainingMeasuredVariables, Matrix gramMatrixInverse, RowVector testRowVector)
LinearRegression
線形回帰の計算を行う静的クラスです。
メソッド
public static ColumnVector Learn(Matrix trainingDesignMatrix, ColumnVector trainingMeasuredVariables)
public static ColumnVector LearnPCR(Matrix trainingDsignMatrix, ColumnVector trainingMeasuredVariables, int numberLatentVariables)
public static ColumnVector LearnPLS1(Matrix trainingDsignMatrix, ColumnVector trainingMeasuredVariables, int numberLatentVariables)
public static ColumnVector LearnRidge(Matrix trainingDsignMatrix, ColumnVector trainingMeasuredVariables, double lambda)
public static ColumnVector Predict(Matrix testDesignMatrix, ColumnVector coefficientW)
LogisticRegression
ロジスティック回帰の静的クラスです。
メソッド
public static ColumnVector Learn(Matrix trainingDsignMatrix, ColumnVector trainingMeasuredVariables, int iterationCount = 100)
public static ColumnVector Predict(Matrix testDesignMatrix, ColumnVector coefficientW)
public static double Predict(RowVector testRowVector, ColumnVector coefficientW)
Preprocessing
前処理の静的クラスです。
メソッド
public static RowVector AddConstant(RowVector rowVector)
public static Matrix AddConstant(Matrix designMatrix)
public static RowVector RelativePosition(RowVector rowVector, RowVector centroid)
public static Matrix RelativePosition(Matrix designMatrix, RowVector centroid)
public static ColumnVector RelativePosition(ColumnVector measuredVariables, double centroid)
public static double RelativePosition(double measuredVariable, double centroid)
public static RowVector ZScoreNormarization(RowVector rowVector, RowVector average, RowVector standardDeviation)
public static Matrix ZScoreNormarization(Matrix designMatrix, RowVector average, RowVector standardDeviation)
public static ColumnVector ZScoreNormarization(ColumnVector measuredVariables, double average, double standardDeviation)
public static double ZScoreNormarization(double measuredVariable, double average, double standardDeviation)
public static RowVector ZScoreNormarizationInverse(RowVector rowVector, RowVector average, RowVector standardDeviation)
public static Matrix ZScoreNormarizationInverse(Matrix designMatrix, RowVector average, RowVector standardDeviation)
public static ColumnVector ZScoreNormarizationInverse(ColumnVector measuredVariables, double average, double standardDeviation)
public static double ZScoreNormarizationInverse(double measuredVariable, double average, double standardDeviation)
PrincipalComponentAnalysis
主成分分析を行う静的クラスです。
メソッド
public static List<ColumnVector> PrincipalComponentScores(Matrix designMatrix)
public static List<ColumnVector> PrincipalComponentScores(Matrix designMatrix, int numberLatentVariables)
public static List<ColumnVector> PrincipalComponents(Matrix designMatrix)
public static List<ColumnVector> PrincipalComponents(Matrix designMatrix, int numberLatentVariables)
SpectralClustering
スペクトルクラスタリングを行う静的クラスです。
メソッド
public static int[] Labeling(Matrix designMatrix, int numberOfClass, IGraphLaplacian iGraphLaplacian, double[] hyperparameters)
KMeansClustering
k-平均法を行う静的クラスです。
メソッド
public static int[] Labeling(Matrix designMatrix, int numberOfClass)
終わりに
ReadMeが微妙なライブラリは使いたくないですが、いざ自分が作るとなると手を抜きたくなりますね。
Discussion