#include <vector>
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;
/**
* 聚类评价指标---CH指数(方差比)
*/
class CalinskiHarabasz {
public:
/**
* countOfClusters: 聚类结果的簇个数
* clusteringResults:输入的所有样本所对应的聚类簇索引
* samples:输入的所有样本
*/
CalinskiHarabasz(int countOfClusters, vector<int> clusteringResults, vector<cv::Point3f> samples) {
// 获取输入样本聚类的簇个数
countOfClusters_ = countOfClusters;
// 获取输入的所有样本点个数
countOfSamples_ = samples.size();
// 根据聚类个数,获取各簇所包含的样本及样本的中心
for (int c = 0; c < countOfClusters_; c++) {
// 用以存储簇c的样本点
vector<cv::Point3f> cluster;
// 用以存储簇c的中心点
cv::Point3f centroid;
double cx = 0, cy = 0, cz = 0;
// 循环遍历所有输入样本点
for (int o = 0; o < samples.size(); o++) {
// 根据所有输入样本的聚类结果,判断样本o是否属于簇c,如果属于,则存储样本o到簇c中
if (clusteringResults[o] == c) {
// 存储样本o到簇c
cluster.push_back(samples[o]);
// 累加簇c所有样本坐标值
cx += samples[o].x;
cy += samples[o].y;
cz += samples[o].z;
}
}
// 计算簇c的样本中心
centroid.x = cx / cluster.size();
centroid.y = cy / cluster.size();
centroid.z = cz / cluster.size();
// 保存簇c和簇c的样本中心
clusters_.push_back(cluster);
centroids_.push_back(centroid);
}
}
/**
* clusters: 聚类的所有簇的所有样本
*/
CalinskiHarabasz(vector<vector<cv::Point3f>> clusters) {
// 获取输入样本聚类的簇个数
countOfClusters_ = clusters.size();
// 初始所有样本点个数为0
countOfSamples_ = 0;
// 根据聚类个数,获取各簇所包含的样本及样本的中心
for (int c = 0; c < countOfClusters_; c++) {
vector<cv::Point3f> cluster;
cv::Point3f centroid;
double cx = 0, cy = 0, cz = 0;
// 循环遍历簇c样本点
for (int o = 0; o < clusters[c].size(); o++) {
// 计算样本点的总个数
countOfSamples_++;
// 存储样本o到簇c
cluster.push_back(clusters[c][o]);
// 累加簇c所有样本坐标值
cx += clusters[c][o].x;
cy += clusters[c][o].y;
cz += clusters[c][o].z;
}
// 计算簇c的样本中心
centroid.x = cx / cluster.size();
centroid.y = cy / cluster.size();
centroid.z = cz / cluster.size();
// 保存簇c和簇c的样本中心
clusters_.push_back(cluster);
centroids_.push_back(centroid);
}
}
~CalinskiHarabasz() {}
/**
* 计算整个聚类结果的CalinskiHarabasz指数(方差比)
*/
double calculateCalinskiHarabasz()
{
double ch = 0;
// 计算各簇的各样本与其簇内中心的距离
double localDistances = caclulateLocalDistances();
// 计算各簇的簇中心与全局簇中心的距离
double interclusterDistances = calculateInterclusterDistances();
// 计算方差比
ch = interclusterDistances / localDistances * (countOfSamples_ - countOfClusters_) / (countOfClusters_ - 1);
return ch;
}
private:
int countOfClusters_; // 簇的个数
int countOfSamples_; // 所有簇包含样本的个数
vector<cv::Point3f> centroids_; // 每个簇的中心
vector<vector<cv::Point3f>> clusters_; // 所有簇的所有样本
/**
* 计算两个样本之间的距离
*/
double evklidDistance(cv::Point3f sample, cv::Point3f centroid) {
double dist = 0;
dist = pow(sample.x - centroid.x, 2) + pow(sample.y - centroid.y, 2) + pow(sample.z - centroid.z, 2);
return dist;
}
/**
* 计算各簇的各样本与其簇内中心的距离和
*/
double caclulateLocalDistances() {
// 用以存储各簇的各样本与其簇内其它样本的距离
double localDistances = 0;
// 循环遍历各簇
for (int c = 0; c < countOfClusters_; c++) {
// 循环遍历簇c,计算簇c各样本与其簇内中心的距离
for (int o = 0; o < clusters_[c].size(); o++) {
// 计算簇c中当前样本o与簇内中心的距离
localDistances += evklidDistance(clusters_[c][o], centroids_[c]);
}
}
return localDistances;
}
/**
* 计算各簇的簇中心与全局簇中心的距离
*/
double calculateInterclusterDistances() {
// 用以存储各簇的各样本与其最近簇内各样本的距离
double interclusterDistances = 0;
// 计算全局簇中心
cv::Point3f g_centroid;
for (int i = 0; i < centroids_.size(); i++) {
g_centroid.x += centroids_[i].x;
g_centroid.y += centroids_[i].y;
g_centroid.z += centroids_[i].z;
}
g_centroid.x /= centroids_.size();
g_centroid.y /= centroids_.size();
g_centroid.z /= centroids_.size();
// 循环遍历各簇
for (int c = 0; c < countOfClusters_; c++) {
// 计算簇c各样本与其最近簇各样本的距离
interclusterDistances += clusters_[c].size() * evklidDistance(centroids_[c], g_centroid);
}
return interclusterDistances;
}
};
Cluster聚类评价指标之CH指数-方差比C++源码附详细注释
需积分: 1 61 浏览量
2023-09-08
10:59:55
上传
评论
收藏 2KB RAR 举报
Sky静
- 粉丝: 4
- 资源: 15
最新资源
- JSP-JTBC-CMS(SQLITE).rar
- MC3362和MC145151调频无线接收器的设计.pdf
- MiniRenamer-v100.0一款简单易用的批量文件重命名工具(已注册PRO版本).rar
- 小狐狸Ai系统 小狐狸ai付费创作系统V2.8.0 ChatGPT智能机器人
- 公孙离-内衣-肚兜.zipgsl
- 快慢指针判断链表是否有环-go 语言实现
- 学生成绩管理系统的设计与实现-收藏备用.pdf
- JSP+SQL网站流量统计管理系统(源代码+论文).rar
- IBM-PC-XT微机过程...道中模拟量数据的采集和处理.pdf
- JSP+SQL网上选课系统(源代码+论文+答辩PPT).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈