来自 计算机教程 2019-11-06 07:36 的文章
当前位置: 美洲杯冠军竞猜 > 计算机教程 > 正文

C#实现基本的矩阵数学库教程,

C#实现基本的矩阵数学库教程,

先给出SimpleMatrix.cs的开头,定义总行数、总列数、所有数据(double类型)

using System;
using System.IO;

namespace NeuralDefs.Matrix
{
    public class SimpleMatrix : IMatrix
    {
        public int Row { get; set; }
        public int Column { get; set; }
        public double[,] Data { get; set; }

其中用了IMatrix矩阵来组织,因为我还写了稀疏矩阵的。关于这个接口在介绍稀疏矩阵时候再写

1、首先实现简单矩阵的最基本功能——赋值和输出

我经常用csv格式的文件,用自然方式存储和查看矩阵

public SimpleMatrix(int row, int col)
        {
            // init matrix
            Row = row;
            Column = col;
            Data = new double[row, col];

            for (var i = 0; i < row; i  )
            {
                for (var j = 0; j < col; j  )
                {
                    Data[i, j] = 0;
                }
            }
        }

        public SimpleMatrix(string fileName)
        {
            //var splitUnit = 't';
            var splitUnit = ',';

            // count columns
            var srCol = new StreamReader(fileName);
            var firstLine = srCol.ReadLine();
            if (firstLine != null)
            {
                var firstArray = firstLine.Split(splitUnit);
                Column = firstArray.Length;
            }
            srCol.Close();

            // count rows
            Row = 0;
            var srRow = new StreamReader(fileName);
            while (srRow.ReadLine() != null)
            {
                Row  ;
            }
            srRow.Close();

            // init matrix
            Data = new double[Row, Column];

            // fill matrix
            var srData = new StreamReader(fileName);
            var curRow = 0;
            string line;
            while ((line = srData.ReadLine()) != null)
            {
                var lineArray = line.Split(splitUnit);
                for (var i = 0; i < lineArray.Length; i  )
                {
                    Data[curRow, i] = double.Parse(lineArray[i]);
                }
                curRow  ;
            }
            srData.Close();
        }

        public void WriteTo(string path)
        {
            var fs = new FileStream(path, FileMode.Create);
            var sw = new StreamWriter(fs);

            for (var i = 0; i < Row; i  )
            {
                sw.WriteLine(this.RowVector(i).ToSingleLineRow());
            }

            sw.Close();
            fs.Close();
        }

2、用索引器取下标

public double this[int row, int column]
        {
            get { return Data[row, column]; }
            set { Data[row, column] = value; }
        }

3、随机化(用于神经网络赋初值等用途)

public void Randomize()
        {
            var rm = new Random();

            for (var i = 0; i < Row; i  )
            {
                for (var j = 0; j < Column; j  )
                {
                    Data[i, j] = rm.Next(-100, 100) / 1000.0;
                }
            }
        }

4、取某行

public SimpleMatrix RowVector(int row)
        {
            var result = new SimpleMatrix(1, Column);

            for (var i = 0; i < Column; i  )
            {
                result[0, i] = Data[row, i];
            }

            return result;
        }

5、减法

public static SimpleMatrix operator -(SimpleMatrix a, SimpleMatrix b)
        {
            var minus = new SimpleMatrix(a.Row, a.Column);

            for (var i = 0; i < minus.Row; i  )
            {
                for (var j = 0; j < minus.Column; j  )
                {
                    minus[i, j] = a[i, j] - b[i, j];
                }
            }
            return minus;
        }

6、范数

public static double Norm2(SimpleMatrix a)
        {
            var norm = 0.0;
            for (var i = 0; i < a.Row; i  )
            {
                for (var j = 0; j < a.Column; j  )
                {
                    norm  = a[i, j] * a[i, j];
                }
            }
            return Math.Sqrt(norm);
        }

7、连接两个向量

public static SimpleMatrix Link(SimpleMatrix vector1, SimpleMatrix vector2)
        {
            // check is vector
            if (vector1.Column != 1 || vector2.Column != 1)
                return null;

            var newRow = vector1.Row   vector2.Row;
            var result = new SimpleMatrix(newRow, 1);

            for (var i = 0; i < vector1.Row; i  )
            {
                result[i, 0] = vector1[i, 0];
            }

            for (var i = 0; i < vector2.Row; i  )
            {
                result[vector1.Row   i, 0] = vector2[i, 0];
            }

            return result;
        }

8、单元素矩阵

 public static SimpleMatrix SingleValueMatrix(double val)
        {
            return new SimpleMatrix(1, 1) { Data = { [0, 0] = val } };
        }

9、绝对值最大元

public static double MaxAbsMember(SimpleMatrix a)
        {
            var max = -1.0;
            foreach (var d in a.Data)
            {
                if (Math.Abs(d) > max)
                    max = Math.Abs(d);
            }
            return max;
        }

10、矩阵转置

public static SimpleMatrix Transpose(SimpleMatrix a)
        {
            var result = new SimpleMatrix(a.Column, a.Row);

            for (var i = 0; i < result.Row; i  )
            {
                for (var j = 0; j < result.Column; j  )
                {
                    result[i, j] = a[j, i];
                }
            }

            return result;
        }

http://www.bkjia.com/C_jc/1236885.htmlwww.bkjia.comtruehttp://www.bkjia.com/C_jc/1236885.htmlTechArticleC#实现基本的矩阵数学库教程, 先给出SimpleMatrix.cs的开头,定义总行数、总列数、所有数据(double类型) using System;using System.IO;namespace Ne...

Data Types - MLlib(数据类型)

 

    MLlib支持存储在单机上的局部向量和局部矩阵,也可以支持通过一个或多个RDD(可伸缩数据集)表示的分布式矩阵。局部向量和局部矩阵是用作公共接口的简单数据模型,实际上底层的线性代数运算由Breeze (机器学习和数值运算的Scala库)和 jblas (Java线性代数运算库)提供。在有监督机器学习中,MLlib使用标记点(labeled point)来表示单个训练语料。

 

局部向量[Local vector]:

局部向量存储在单机上,使用整数表示索引,索引从0开始;使用双精度浮点数(double)存储数值。MLlib支持两种类型的局部向量:密集型和稀疏型。密集向量(dense vector)使用double数组表示元素值,而稀疏向量(sparse vector)通过两个并列的数组来表示:一个表示索引,一个表示数值。例如:向量(1.0, 0.0, 3.0)使用密集型可表示为:[1.0, 0.0, 3.0], 而使用稀疏型可以表示为:(3, [0, 2]篮球世界杯冠军竞猜,, [1.0, 3.0]], 其中3是向量的长度。

 

import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;

// Create a dense vector (1.0, 0.0, 3.0).
Vector dv = Vectors.dense(1.0, 0.0, 3.0);
// Create a sparse vector (1.0, 0.0, 3.0) by specifying its indices and values corresponding to nonzero entries.
Vector sv = Vectors.sparse(3, new int[] {0, 2}, new double[] {1.0, 3.0});

 

标记点[Labeled point]:

标记点是局部向量,向量可以是密集型或者稀疏型,每个向量会关联了一个标签(label)。MLlib的标记点用于有监督学习算法。我们使用double来存储标签值,这样标记点既可以用于回归又可以用于分类。在二分类中,标签要么是0要么是1;在多分类中,标签是0, 1, 2, ….

 

import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.regression.LabeledPoint;

// Create a labeled point with a positive label and a dense feature vector.
LabeledPoint pos = new LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0));

// Create a labeled point with a negative label and a sparse feature vector.
LabeledPoint neg = new LabeledPoint(0.0, Vectors.sparse(3, new int[] {0, 2}, new double[] {1.0, 3.0})); 

 

稀疏数据[Sparse data]:

在实践中经常用到稀疏训练数据。MLlib支持读取LIBSVM格式的训练语料数据,这个是 LIBSVM 和LIBLINERAR 中用到的默认格式(LIBSVM和LIBLINERAR是台湾林智仁教授开发的的SVM库和线性分类器)。这是一种文本格式,每行表示一个标记的稀疏特征向量,示例如下:

 

label index1:value1 index2:value2 ...

字符串使用空格分隔,索引从0开始,以递增的训练排列。导入系统后,特征索引自动转为从0开始索引。

import org.apache.spark.mllib.regression.LabeledPoint;
import org.apache.spark.mllib.util.MLUtils;
import org.apache.spark.api.java.JavaRDD;

JavaRDD<LabeledPoint> examples = MLUtils.loadLibSVMFile(jsc.sc(), "data/mllib/sample_libsvm_data.txt").toJavaRDD();

 

 

局部矩阵[Local matrix]:

局部矩阵使用整型行列索引和浮点(double)数值,存储在单机上。MLIB支持密集型矩阵,元素值按列优先以double数组的方式存储。例如,下面的矩阵:

会被存储为一维数组[1.0, 3.0, 5.0, 2.0, 4.0, 6.0],矩阵的大小是(3, 2)。

 

本文由美洲杯冠军竞猜发布于计算机教程,转载请注明出处:C#实现基本的矩阵数学库教程,

关键词: