This commit is contained in:
2025-09-04 14:08:53 +08:00
parent 8586371b19
commit aa076e8de5

View File

@@ -0,0 +1,106 @@
package org.dromara.easyai.tools;
import org.dromara.easyai.matrixTools.Matrix;
import org.dromara.easyai.entity.RGBNorm;
/**
* @param
* @DATA
* @Author LiDaPeng
* @Description
*/
public class GMClustering extends MeanClustering {
private float regionSize;//单区域面积
public float getRegionSize() {
return regionSize;
}
public void setRegionSize(float regionSize) {
this.regionSize = regionSize;
}
public GMClustering(int speciesQuantity, int maxTimes) throws Exception {
super(speciesQuantity, maxTimes);
}
public int getProbabilityDensity(float[] feature) throws Exception {//获取簇id
float maxPower = 0;
int id = 0;
int index = 0;
for (RGBNorm rgbNorm : matrices) {
float power = rgbNorm.getGMProbability(feature);
if (power > maxPower) {
maxPower = power;
id = index;
}
index++;
}
return id;
}
@Override
public void start() throws Exception {
super.start();
for (RGBNorm rgbNorm : matrices) {//高斯系数初始化
rgbNorm.gm();
}
for (int i = 0; i < 50; i++) {
gmClustering();
}
}
public void insertParameter(Matrix matrix) throws Exception {
int y = matrix.getY();
int size = y / speciesQuantity;
for (int i = 0; i <= y - size; i += size) {
float[] feature = new float[size];
RGBNorm rgbNorm = new RGBNorm();
matrices.add(rgbNorm);
for (int j = i; j < i + size; j++) {
feature[j - i] = matrix.getNumber(0, j);
}
rgbNorm.insertFeature(feature);
}
}
private void clear() {
for (RGBNorm rgbNorm : matrices) {//高斯系数初始化
rgbNorm.clearRGB();
}
}
private void gmClustering() throws Exception {//进行gm聚类
clear();
for (float[] rgb : matrixList) {//遍历当前集合
float allProbability = 0;//全概率
float[] pro = new float[speciesQuantity];
for (int i = 0; i < speciesQuantity; i++) {
RGBNorm rgbNorm = matrices.get(i);
float probability = rgbNorm.getGMProbability(rgb);
//System.out.println("pro===" + probability);
allProbability = allProbability + probability;
pro[i] = probability;
}
//求每个簇的后验概率
for (int i = 0; i < speciesQuantity; i++) {
pro[i] = pro[i] / allProbability;
}
//判断概率最大的簇
int index = 0;
float max = 0;
for (int i = 0; i < speciesQuantity; i++) {
if (pro[i] > max) {
max = pro[i];
index = i;
}
}
//注入特征
matrices.get(index).setGmFeature(rgb, pro[index]);
}
for (RGBNorm rgbNorm : matrices) {//高斯系数初始化
rgbNorm.gm();
}
}
}