1. 項目依賴配置

首先在pom.xml中添加依賴:

xml
<dependencies>
    <dependency>
        <groupId>org.deeplearning4j</groupId>
        <artifactId>deeplearning4j-core</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
    <dependency>
        <groupId>org.nd4j</groupId>
        <artifactId>nd4j-native-platform</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
    <dependency>
        <groupId>org.datavec</groupId>
        <artifactId>datavec-api</artifactId>
        <version>1.0.0-M2.1</version>
    </dependency>
</dependencies>

2. 數據預處理類

java
import org.datavec.api.records.reader.RecordReader;
import org.datavec.api.records.reader.impl.csv.CSVRecordReader;
import org.datavec.api.split.FileSplit;
import org.datavec.api.transform.TransformProcess;
import org.datavec.api.transform.schema.Schema;
import org.datavec.api.writable.Writable;
import org.datavec.local.transforms.LocalTransformExecutor;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.api.DataSetPreProcessor;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.indexing.INDArrayIndex;
import org.nd4j.linalg.indexing.NDArrayIndex;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class EnergyDataPreprocessor {
    private static final int NUM_HISTORICAL_TIMESTEPS = 24; // 使用過去24小時的數據
    private static final int NUM_PREDICTION_TIMESTEPS = 6;  // 預測未來6小時
    
    public static List<DataSet> loadAndPreprocessData(String filePath) throws Exception {
        // 讀取CSV數據
        RecordReader recordReader = new CSVRecordReader(1, ','); // 跳過表頭
        recordReader.initialize(new FileSplit(new File(filePath)));
        
        List<List<Writable>> allData = new ArrayList<>();
        while (recordReader.hasNext()) {
            allData.add(recordReader.next());
        }
        
        // 定義數據模式
        Schema schema = new Schema.Builder()
            .addColumnDouble("timestamp")      // 時間戳
            .addColumnDouble("temperature")    // 温度
            .addColumnDouble("humidity")       // 濕度
            .addColumnDouble("wind_speed")     // 風速
            .addColumnDouble("solar_radiation") // 太陽輻射
            .addColumnDouble("energy_output")  // 能源輸出(目標變量)
            .build();
        
        // 數據轉換(歸一化)
        TransformProcess transformProcess = new TransformProcess.Builder(schema)
            .removeColumns("timestamp") // 移除時間戳列
            .build();
        
        List<List<Writable>> processedData = LocalTransformExecutor.execute(allData, transformProcess);
        
        return createTimeSeriesDataSet(processedData);
    }
    
    private static List<DataSet> createTimeSeriesDataSet(List<List<Writable>> data) {
        List<DataSet> dataSets = new ArrayList<>();
        int totalSamples = data.size() - NUM_HISTORICAL_TIMESTEPS - NUM_PREDICTION_TIMESTEPS + 1;
        
        for (int i = 0; i < totalSamples; i++) {
            // 特徵數據(歷史數據)
            INDArray features = Nd4j.create(new int[]{
                1, // mini-batch大小
                5,  // 特徵數量(温度、濕度、風速、太陽輻射、能源輸出)
                NUM_HISTORICAL_TIMESTEPS // 時間步長
            });
            
            // 標籤數據(未來預測)
            INDArray labels = Nd4j.create(new int[]{
                1, 
                1,  // 只預測能源輸出
                NUM_PREDICTION_TIMESTEPS
            });
            
            // 填充特徵數據
            for (int j = 0; j < NUM_HISTORICAL_TIMESTEPS; j++) {
                List<Writable> currentRow = data.get(i + j);
                for (int k = 0; k < 5; k++) {
                    features.putScalar(new int[]{0, k, j}, currentRow.get(k).toDouble());
                }
            }
            
            // 填充標籤數據
            for (int j = 0; j < NUM_PREDICTION_TIMESTEPS; j++) {
                List<Writable> futureRow = data.get(i + NUM_HISTORICAL_TIMESTEPS + j);
                // 只取能源輸出作為預測目標
                labels.putScalar(new int[]{0, 0, j}, futureRow.get(4).toDouble());
            }
            
            dataSets.add(new DataSet(features, labels));
        }
        
        return dataSets;
    }
}

3. LSTM模型構建類

java
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.LSTM;
import org.deeplearning4j.nn.conf.layers.RnnOutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.nn.weights.WeightInit;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.nd4j.linalg.activations.Activation;
import org.nd4j.linalg.learning.config.Adam;
import org.nd4j.linalg.lossfunctions.LossFunctions;

public class LSTMModelBuilder {
    
    public static MultiLayerNetwork buildLSTMModel(int numInputFeatures, int numOutputs) {
        int lstmLayer1Size = 128;
        int lstmLayer2Size = 64;
        double learningRate = 0.001;
        double l2 = 0.001;
        
        MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder()
            .seed(12345)
            .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
            .updater(new Adam(learningRate))
            .l2(l2)
            .list()
            .layer(0, new LSTM.Builder()
                .nIn(numInputFeatures)
                .nOut(lstmLayer1Size)
                .activation(Activation.TANH)
                .weightInit(WeightInit.XAVIER)
                .build())
            .layer(1, new LSTM.Builder()
                .nIn(lstmLayer1Size)
                .nOut(lstmLayer2Size)
                .activation(Activation.TANH)
                .weightInit(WeightInit.XAVIER)
                .build())
            .layer(2, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MSE)
                .activation(Activation.IDENTITY)
                .weightInit(WeightInit.XAVIER)
                .nIn(lstmLayer2Size)
                .nOut(numOutputs)
                .build())
            .build();
        
        MultiLayerNetwork model = new MultiLayerNetwork(configuration);
        model.init();
        model.setListeners(new ScoreIterationListener(100));
        
        return model;
    }
}

4. 模型訓練和評估類

java
import org.deeplearning4j.earlystopping.EarlyStoppingConfiguration;
import org.deeplearning4j.earlystopping.EarlyStoppingResult;
import org.deeplearning4j.earlystopping.saver.LocalFileModelSaver;
import org.deeplearning4j.earlystopping.termination.MaxEpochsTerminationCondition;
import org.deeplearning4j.earlystopping.termination.MaxTimeTerminationCondition;
import org.deeplearning4j.earlystopping.trainer.EarlyStoppingTrainer;
import org.nd4j.linalg.dataset.DataSet;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.iterator.impl.ListDataSetIterator;
import org.nd4j.evaluation.regression.RegressionEvaluation;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class EnergyPredictorTrainer {
    
    public static void trainAndEvaluate(String dataPath) throws Exception {
        // 加載和預處理數據
        List<DataSet> allData = EnergyDataPreprocessor.loadAndPreprocessData(dataPath);
        
        // 分割訓練集和測試集
        int trainSize = (int) (allData.size() * 0.8);
        List<DataSet> trainData = allData.subList(0, trainSize);
        List<DataSet> testData = allData.subList(trainSize, allData.size());
        
        // 創建迭代器
        ListDataSetIterator trainIterator = new ListDataSetIterator(trainData, 32);
        ListDataSetIterator testIterator = new ListDataSetIterator(testData, 32);
        
        // 構建模型
        MultiLayerNetwork model = LSTMModelBuilder.buildLSTMModel(5, 1); // 5個輸入特徵,1個輸出
        
        // 配置早停
        EarlyStoppingConfiguration<MultiLayerNetwork> esConfig = 
            new EarlyStoppingConfiguration.Builder<MultiLayerNetwork>()
                .epochTerminationConditions(new MaxEpochsTerminationCondition(100))
                .iterationTerminationConditions(
                    new MaxTimeTerminationCondition(30, TimeUnit.MINUTES))
                .scoreCalculator(new org.deeplearning4j.earlystopping.scorecalc.DataSetLossCalculator(testIterator, true))
                .evaluateEveryNEpochs(1)
                .modelSaver(new LocalFileModelSaver("models/"))
                .build();
        
        EarlyStoppingTrainer trainer = new EarlyStoppingTrainer(
            esConfig, model, trainIterator, testIterator);
        
        // 開始訓練
        EarlyStoppingResult<MultiLayerNetwork> result = trainer.fit();
        System.out.println("訓練完成!最佳模型epoch: " + result.getBestModelEpoch());
        
        // 加載最佳模型
        MultiLayerNetwork bestModel = result.getBestModel();
        
        // 評估模型
        evaluateModel(bestModel, testIterator);
        
        // 保存模型
        bestModel.save(new File("models/best_energy_model.zip"), true);
    }
    
    private static void evaluateModel(MultiLayerNetwork model, DataSetIterator testIterator) {
        RegressionEvaluation evaluation = new RegressionEvaluation();
        testIterator.reset();
        
        while (testIterator.hasNext()) {
            DataSet batch = testIterator.next();
            INDArray features = batch.getFeatures();
            INDArray labels = batch.getLabels();
            
            INDArray predictions = model.output(features, false);
            evaluation.eval(labels, predictions);
        }
        
        System.out.println("模型評估結果:");
        System.out.println(evaluation.stats());
    }
}

5. 預測類

java
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.factory.Nd4j;

import java.util.List;

public class EnergyPredictor {
    private MultiLayerNetwork model;
    
    public EnergyPredictor(MultiLayerNetwork model) {
        this.model = model;
    }
    
    public INDArray predictFutureEnergy(INDArray historicalData) {
        // historicalData 形狀: [1, 特徵數, 時間步長]
        return model.output(historicalData, false);
    }
    
    public static void main(String[] args) throws Exception {
        // 加載訓練好的模型
        MultiLayerNetwork model = MultiLayerNetwork.load(
            new File("models/best_energy_model.zip"), true);
        
        EnergyPredictor predictor = new EnergyPredictor(model);
        
        // 示例:使用最新數據預測未來能源輸出
        // 這裏需要準備實際的歷史數據
        INDArray sampleData = Nd4j.create(new int[]{1, 5, 24}); // batch=1, 特徵=5, 時間步=24
        // 填充實際數據...
        
        INDArray prediction = predictor.predictFutureEnergy(sampleData);
        System.out.println("未來能源輸出預測: " + prediction);
    }
}

6. 主程序入口

java
public class RenewableEnergyForecasting {
    public static void main(String[] args) {
        try {
            String dataPath = "data/energy_data.csv"; // 您的數據文件路徑
            
            System.out.println("開始訓練新能源預測模型...");
            EnergyPredictorTrainer.trainAndEvaluate(dataPath);
            System.out.println("模型訓練完成!");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
https://rd.xjyl.gov.cn/upload/1981375792641703936.html
https://rd.xjyl.gov.cn/upload/1981375793530896384.html

https://rd.xjyl.gov.cn/upload/1981375796278165504.html

https://rd.xjyl.gov.cn/upload/1981375797129609216.html

https://rd.xjyl.gov.cn/upload/1981375803794358272.html

https://rd.xjyl.gov.cn/upload/1981375804574498816.html

https://rd.xjyl.gov.cn/upload/1981375804817768448.html

https://rd.xjyl.gov.cn/upload/1981375805056843776.html

https://rd.xjyl.gov.cn/upload/1981375805606297600.html

https://rd.xjyl.gov.cn/upload/1981375806029922304.html

關鍵特性説明

  1. 數據預處理
  • 處理時間序列數據
  • 歸一化特徵值
  • 創建滑動窗口數據集
  1. LSTM網絡結構
  • 兩層LSTM網絡
  • 使用tanh激活函數
  • 全連接輸出層
  1. 訓練優化
  • 使用Adam優化器
  • 早停機制防止過擬合
  • L2正則化
  1. 模型評估
  • 迴歸評估指標
  • 訓練/測試集分割
  • 模型性能監控

這個框架可以用於預測太陽能、風能等新能源的輸出,您需要根據實際數據調整特徵工程和模型參數。