矩阵乘法和归一化在C程序中的实现

1. 矩阵乘法

1.1 矩阵的定义

矩阵是数学中的一种运算工具,它由$m$行$n$列的数排成一个矩形,用大写字母如$A$、$B$等表示。

数学上通常用数组表示一个矩阵,比如一个$3\times2$的矩阵可以表示为:

int A[3][2] = {{1, 2}, {3, 4}, {5, 6}};

其中,$A_{11}=1$,$A_{12}=2$,$A_{21}=3$,$A_{22}=4$,$A_{31}=5$,$A_{32}=6$。表示第$i$行第$j$列的元素用$A_{ij}$表示。

1.2 矩阵乘法的定义

矩阵乘法是指两个矩阵相乘得到另一个矩阵的运算,它由以下公式定义:

$$C_{ij}=\sum\limits_{k=1}^n A_{ik}B_{kj}$$

其中,$A$是一个$m\times n$的矩阵,$B$是一个$n\times p$的矩阵,$C$是一个$m\times p$的矩阵。

在代码中,可以用两个二维数组分别表示矩阵$A$和矩阵$B$,用一个二维数组表示矩阵$C$。下面是矩阵乘法的例子:

const int MAXN = 100;

void matrix_multiply(int A[][MAXN], int B[][MAXN], int C[][MAXN], int m, int n, int p) {

for (int i = 0; i < m; i++) {

for (int j = 0; j < p; j++) {

C[i][j] = 0;

for (int k = 0; k < n; k++) {

C[i][j] += A[i][k] * B[k][j];

}

}

}

}

其中,$A$是$m\times n$的矩阵,$B$是$n\times p$的矩阵,$C$是$m\times p$的矩阵。

1.3 矩阵乘法的性质

矩阵乘法有以下几个性质:

不满足交换律,即$A\times B\ne B\times A$。

满足结合律,即$(A\times B)\times C=A\times (B\times C)$。

满足分配律,即$(A+B)\times C=A\times C+B\times C$和$C\times (A+B)=C\times A+C\times B$。

如果矩阵$A$和$B$的乘积得到了$C$,则矩阵$C$的转置与矩阵$A$和$B$的转置的乘积相等,即$(A\times B)^T=B^T\times A^T$。

2. 归一化

2.1 归一化的定义

归一化是将数据集中的数据统一到一个区间内的过程。在机器学习中,归一化的作用是防止某些数据过大或者过小导致某些特征的权重过大或过小,从而影响到模型的准确性。

2.2 归一化的方法

归一化有以下几种方法:

线性归一化

对数归一化

指数归一化

z-score标准化

2.3 线性归一化的实现

线性归一化是将数据缩放到0和1之间的一种方法。

如果$X$是一个一维的向量,$x_i$表示向量中的第$i$个元素,$x_{scale}$表示归一化后的数据,则线性归一化的公式为:

$$x_{scale}=\frac{x_i-\min(X)}{\max(X)-\min(X)}$$

其中,$\min(X)$和$\max(X)$分别表示向量中的最小值和最大值。

在代码中,可以用以下代码实现线性归一化:

const int MAXN = 100;

void linear_scaling(double X[], double x_scale[], int n) {

double xmin = DBL_MAX, xmax = DBL_MIN;

for (int i = 0; i < n; i++) {

if (X[i] < xmin) xmin = X[i];

if (X[i] > xmax) xmax = X[i];

}

for (int i = 0; i < n; i++) {

x_scale[i] = (X[i] - xmin) / (xmax - xmin);

}

}

其中,$X$是一个一维的向量,$x_scale$也是一个一维的向量,表示归一化后的数据,$n$表示向量中的元素个数。

2.4 z-score标准化的实现

z-score标准化是将数据缩放到均值为0,标准差为1之间的一种方法,适用于数据服从高斯分布的情况。

如果$X$是一个一维的向量,$x_i$表示向量中的第$i$个元素,$\mu$和$\sigma$分别表示向量中的均值和标准差,$x_{scale}$表示归一化后的数据,则z-score标准化的公式为:

$$x_{scale}=\frac{x_i-\mu}{\sigma}$$

其中,$\mu$和$\sigma$分别由以下公式计算得到:

$$\mu=\frac{\sum_{i=1}^n x_i}{n}$$

$$\sigma=\sqrt{\frac{\sum_{i=1}^n (x_i-\mu)^2}{n}}$$

在代码中,可以用以下代码实现z-score标准化:

const int MAXN = 100;

void zscore_scaling(double X[], double x_scale[], int n) {

double sum = 0, sum2 = 0;

for (int i = 0; i < n; i++) {

sum += X[i];

sum2 += X[i] * X[i];

}

double mean = sum / n;

double stdev = sqrt((sum2 - n * mean * mean) / n);

for (int i = 0; i < n; i++) {

x_scale[i] = (X[i] - mean) / stdev;

}

}

其中,$X$是一个一维的向量,$x_scale$也是一个一维的向量,表示归一化后的数据,$n$表示向量中的元素个数。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签