C++最小二乘法图像分类
时间: 2024-01-06 22:05:51 浏览: 79
最小二乘法是一种常用的回归分析方法,可以用于图像分类。下面是C++实现最小二乘法图像分类的示例代码:
```c++
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
const int N = 100; // 样本数
const int M = 3; // 特征数
double x[N][M]; // 特征矩阵
int y[N]; // 标签向量
// 读取数据
void read_data() {
ifstream fin("data.txt");
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
fin >> x[i][j];
}
fin >> y[i];
}
fin.close();
}
// 计算矩阵的转置
void transpose(double a[][M], double b[][N], int n, int m) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
b[i][j] = a[j][i];
}
}
}
// 矩阵乘法
void matrix_multiply(double a[][N], double b[][M], double c[][M], int n, int m, int k) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
c[i][j] = 0;
for (int l = 0; l < m; l++) {
c[i][j] += a[i][l] * b[l][j];
}
}
}
}
// 矩阵加法
void matrix_add(double a[][M], double b[][M], double c[][M], int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
}
// 矩阵数乘
void matrix_scalar_multiply(double a[][M], double b, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
a[i][j] *= b;
}
}
}
// 矩阵求逆
bool matrix_inverse(double a[][M], double b[][M], int n) {
double temp[N][2 * N];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
temp[i][j] = a[i][j];
}
for (int j = n; j < 2 * n; j++) {
temp[i][j] = (i == j - n) ? 1 : 0;
}
}
for (int i = 0; i < n; i++) {
if (temp[i][i] == 0) {
return false;
}
for (int j = i + 1; j < 2 * n; j++) {
temp[i][j] /= temp[i][i];
}
temp[i][i] = 1;
for (int j = 0; j < n; j++) {
if (i != j) {
for (int k = i + 1; k < 2 * n; k++) {
temp[j][k] -= temp[j][i] * temp[i][k];
}
temp[j][i] = 0;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = n; j < 2 * n; j++) {
b[i][j - n] = temp[i][j];
}
}
return true;
}
// 最小二乘法
void least_squares() {
double xt[M][N], xtx[M][M], xtx_inv[M][M], xty[M], w[M];
int cnt[2] = {0, 0};
for (int i = 0; i < N; i++) {
cnt[y[i]]++;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
xt[j][i] = x[i][j];
}
xty[0][i] = y[i];
}
matrix_multiply(xt, x, xtx, M, N, M);
matrix_add(xtx, 0.01 * cnt[1] / cnt[0] * xtx, xtx, M, M);
if (!matrix_inverse(xtx, xtx_inv, M)) {
cout << "Matrix is not invertible." << endl;
return;
}
matrix_multiply(xtx_inv, xt, w, M, M, N);
matrix_multiply(w, xty, w, M, N, 1);
cout << "w = [";
for (int i = 0; i < M; i++) {
cout << w[i][0];
if (i < M - 1) {
cout << ", ";
}
}
cout << "]" << endl;
}
int main() {
read_data();
least_squares();
return 0;
}
```
阅读全文
相关推荐















