107 lines
3.1 KiB
Java
107 lines
3.1 KiB
Java
|
|
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();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|