用C语言写一个FCM算法
时间: 2023-04-01 15:03:55 浏览: 83
你好,以下是用C语言写一个FCM算法的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 100
#define EPSILON .0001
void fcm(double **data, int n, int m, int c, double **centers, double **membership) {
int i, j, k, iter;
double **dist, **new_membership, *sum, *norm, max_diff, diff;
// Allocate memory for distance matrix
dist = (double **)malloc(n * sizeof(double *));
for (i = ; i < n; i++) {
dist[i] = (double *)malloc(c * sizeof(double));
}
// Allocate memory for new membership matrix
new_membership = (double **)malloc(n * sizeof(double *));
for (i = ; i < n; i++) {
new_membership[i] = (double *)malloc(c * sizeof(double));
}
// Allocate memory for sum and norm arrays
sum = (double *)malloc(c * sizeof(double));
norm = (double *)malloc(n * sizeof(double));
// Initialize membership matrix
for (i = ; i < n; i++) {
for (j = ; j < c; j++) {
membership[i][j] = 1. / c;
}
}
// Main loop
for (iter = ; iter < MAX_ITER; iter++) {
// Calculate distance matrix
for (i = ; i < n; i++) {
for (j = ; j < c; j++) {
dist[i][j] = .;
for (k = ; k < m; k++) {
dist[i][j] += pow(data[i][k] - centers[j][k], 2);
}
dist[i][j] = sqrt(dist[i][j]);
}
}
// Update membership matrix
max_diff = .;
for (i = ; i < n; i++) {
for (j = ; j < c; j++) {
new_membership[i][j] = .;
for (k = ; k < c; k++) {
new_membership[i][j] += pow(dist[i][j] / dist[i][k], 2. / (c - 1));
}
new_membership[i][j] = 1. / new_membership[i][j];
diff = fabs(new_membership[i][j] - membership[i][j]);
if (diff > max_diff) {
max_diff = diff;
}
}
}
if (max_diff < EPSILON) {
break;
}
for (i = ; i < n; i++) {
for (j = ; j < c; j++) {
membership[i][j] = new_membership[i][j];
}
}
// Update centers
for (j = ; j < c; j++) {
for (k = ; k < m; k++) {
sum[j] = .;
for (i = ; i < n; i++) {
sum[j] += pow(membership[i][j], 2) * data[i][k];
}
centers[j][k] = sum[j] / norm[j];
}
}
}
// Free memory
for (i = ; i < n; i++) {
free(dist[i]);
free(new_membership[i]);
}
free(dist);
free(new_membership);
free(sum);
free(norm);
}
int main() {
int n = 10; // number of data points
int m = 2; // number of features
int c = 3; // number of clusters
double **data, **centers, **membership;
int i, j;
// Allocate memory for data matrix
data = (double **)malloc(n * sizeof(double *));
for (i = ; i < n; i++) {
data[i] = (double *)malloc(m * sizeof(double));
}
// Initialize data matrix
data[][] = 1.; data[][1] = 1.;
data[1][] = 1.5; data[1][1] = 2.;
data[2][] = 3.; data[2][1] = 4.;
data[3][] = 5.; data[3][1] = 7.;
data[4][] = 3.5; data[4][1] = 5.;
data[5][] = 4.5; data[5][1] = 5.;
data[6][] = 3.5; data[6][1] = 4.5;
data[7][] = 4.5; data[7][1] = 4.5;
data[8][] = 5.; data[8][1] = 4.5;
data[9][] = 5.5; data[9][1] = 4.5;
// Allocate memory for centers matrix
centers = (double **)malloc(c * sizeof(double *));
for (i = ; i < c; i++) {
centers[i] = (double *)malloc(m * sizeof(double));
}
// Initialize centers matrix
centers[][] = 1.; centers[][1] = 1.;
centers[1][] = 5.; centers[1][1] = 7.;
centers[2][] = 3.5; centers[2][1] = 4.5;
// Allocate memory for membership matrix
membership = (double **)malloc(n * sizeof(double *));
for (i = ; i < n; i++) {
membership[i] = (double *)malloc(c * sizeof(double));
}
// Run FCM algorithm
fcm(data, n, m, c, centers, membership);
// Print results
for (i = ; i < n; i++) {
printf("Data point %d: ", i);
for (j = ; j < m; j++) {
printf("%f ", data[i][j]);
}
printf("Membership: ");
for (j = ; j < c; j++) {
printf("%f ", membership[i][j]);
}
printf("\n");
}
// Free memory
for (i = ; i < n; i++) {
free(data[i]);
free(membership[i]);
}
free(data);
free(membership);
for (i = ; i < c; i++) {
free(centers[i]);
}
free(centers);
return ;
}
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)