模糊核方法:概述及C++代码示例
基于模糊核的方法包括模糊C均值聚类(FCM)、模糊神经网络(FNN)、模糊决策树(FDT)、模糊关联规则(FAR)等。以下是一个基于模糊C均值聚类的代码示例:
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
// 模糊C均值聚类函数
vector<vector<double>> fuzzy_c_means(vector<vector<double>> data, int k, double m, double eps) {
int n = data.size(); // 样本数
int d = data[0].size(); // 维数
vector<vector<double>> centers(k, vector<double>(d)); // 聚类中心
vector<vector<double>> membership(n, vector<double>(k)); // 每个样本对每个聚类中心的隶属度
// 随机初始化聚类中心
for (int i = 0; i < k; i++) {
int idx = rand() % n;
centers[i] = data[idx];
}
// 迭代计算聚类中心
while (true) {
// 计算每个样本对每个聚类中心的隶属度
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++) {
double dist = 0.0;
for (int l = 0; l < d; l++) {
dist += pow(data[i][l] - centers[j][l], 2.0);
}
membership[i][j] = 1.0 / accumulate(membership[i].begin(), membership[i].end(), 0.0, [&](double a, double b) { return a + pow(dist / b, 1.0 / (m - 1.0)); });
}
}
// 计算新的聚类中心
vector<vector<double>> new_centers(k, vector<double>(d));
for (int j = 0; j < k; j++) {
for (int l = 0; l < d; l++) {
new_centers[j][l] = accumulate(membership.begin(), membership.end(), 0.0, [&](double a, vector<double> b) { return a + pow(b[j], m) * data[&b - &membership[0]][l]; }) / accumulate(membership.begin(), membership.end(), 0.0, [&](double a, vector<double> b) { return a + pow(b[j], m); });
}
}
// 判断是否收敛
double delta = 0.0;
for (int j = 0; j < k; j++) {
delta += accumulate(new_centers[j].begin(), new_centers[j].end(), 0.0, [&](double a, double b) { return a + pow(b - centers[j][&b - &new_centers[j][0]], 2.0); });
}
if (delta < eps) {
break;
}
centers = new_centers;
}
return membership;
}
int main() {
// 生成随机数据
vector<vector<double>> data = {{1.0, 2.0}, {2.0, 3.0}, {3.0, 4.0}, {4.0, 5.0}, {5.0, 6.0}, {6.0, 7.0}};
// 聚类
int k = 2; // 聚类数
double m = 2.0; // 模糊度
double eps = 1e-6; // 收敛误差
vector<vector<double>> membership = fuzzy_c_means(data, k, m, eps);
// 输出结果
for (int i = 0; i < data.size(); i++) {
for (int j = 0; j < k; j++) {
cout << membership[i][j] << " ";
}
cout << endl;
}
return 0;
}
原文地址: https://www.cveoy.top/t/topic/oLpR 著作权归作者所有。请勿转载和采集!