首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >慕ke Java版数据结构和算法+AI算法和技能

慕ke Java版数据结构和算法+AI算法和技能

原创
作者头像
用户11659095
发布2025-06-03 18:14:54
发布2025-06-03 18:14:54
10000
代码可运行
举报
运行总次数:0
代码可运行

AI算法入门必学:从线性回归到神经网络,Java代码实现全解析(附完整案例)

一、引言

人工智能(AI)算法是机器学习与深度学习的核心,其应用场景涵盖预测、分类、图像识别等。本文将从基础线性回归到神经网络,结合Java代码实现,解析AI算法的核心原理与实践方法。


二、线性回归:AI算法的基石

1. 算法原理

线性回归通过拟合一条直线,最小化预测值与实际值之间的误差平方和。其数学模型为:

y=mx+b

其中,m为斜率,b为截距。

2. Java实现代码

以下是一个完整的线性回归实现,包含数据预处理、模型训练与预测:

代码语言:javascript
代码运行次数:0
运行
复制
java
代码语言:javascript
代码运行次数:0
运行
复制
import Jama.Matrix;
代码语言:javascript
代码运行次数:0
运行
复制
public class LinearRegression {
代码语言:javascript
代码运行次数:0
运行
复制
    private double[] coefficients;
代码语言:javascript
代码运行次数:0
运行
复制
    // 添加偏置项(特征矩阵中插入全1列)
代码语言:javascript
代码运行次数:0
运行
复制
    private double[][] addIntercept(double[][] X) {
代码语言:javascript
代码运行次数:0
运行
复制
        int nSamples = X.length;
代码语言:javascript
代码运行次数:0
运行
复制
        int nFeatures = X[0].length;
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] X_with_intercept = new double[nSamples][nFeatures + 1];
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < nSamples; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            X_with_intercept[i][0] = 1; // 偏置项
代码语言:javascript
代码运行次数:0
运行
复制
            System.arraycopy(X[i], 0, X_with_intercept[i], 1, nFeatures);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        return X_with_intercept;
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 计算系数(最小二乘法)
代码语言:javascript
代码运行次数:0
运行
复制
    private double[] calculateCoefficients(double[][] X, double[] y) {
代码语言:javascript
代码运行次数:0
运行
复制
        int nFeatures = X[0].length;
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] XtX = new double[nFeatures][nFeatures];
代码语言:javascript
代码运行次数:0
运行
复制
        double[] XtY = new double[nFeatures];
代码语言:javascript
代码运行次数:0
运行
复制
        // 计算XtX和XtY
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < X.length; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            for (int j = 0; j < nFeatures; j++) {
代码语言:javascript
代码运行次数:0
运行
复制
                for (int k = 0; k < nFeatures; k++) {
代码语言:javascript
代码运行次数:0
运行
复制
                    XtX[j][k] += X[i][j] * X[i][k];
代码语言:javascript
代码运行次数:0
运行
复制
                }
代码语言:javascript
代码运行次数:0
运行
复制
                XtY[j] += X[i][j] * y[i];
代码语言:javascript
代码运行次数:0
运行
复制
            }
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        // 解线性方程组
代码语言:javascript
代码运行次数:0
运行
复制
        return solveLinearEquation(XtX, XtY);
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 解线性方程组(使用Jama库)
代码语言:javascript
代码运行次数:0
运行
复制
    private double[] solveLinearEquation(double[][] A, double[] b) {
代码语言:javascript
代码运行次数:0
运行
复制
        Matrix matrixA = new Matrix(A);
代码语言:javascript
代码运行次数:0
运行
复制
        Matrix matrixB = new Matrix(b, b.length);
代码语言:javascript
代码运行次数:0
运行
复制
        Matrix solution = matrixA.solve(matrixB);
代码语言:javascript
代码运行次数:0
运行
复制
        double[] result = new double[solution.getRowDimension()];
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < result.length; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            result[i] = solution.get(i, 0);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        return result;
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 训练模型
代码语言:javascript
代码运行次数:0
运行
复制
    public void fit(double[][] X, double[] y) {
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] X_with_intercept = addIntercept(X);
代码语言:javascript
代码运行次数:0
运行
复制
        coefficients = calculateCoefficients(X_with_intercept, y);
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 预测
代码语言:javascript
代码运行次数:0
运行
复制
    public double[] predict(double[][] X) {
代码语言:javascript
代码运行次数:0
运行
复制
        if (coefficients == null) {
代码语言:javascript
代码运行次数:0
运行
复制
            throw new IllegalStateException("模型尚未训练,请先调用fit方法。");
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] X_with_intercept = addIntercept(X);
代码语言:javascript
代码运行次数:0
运行
复制
        double[] predictions = new double[X_with_intercept.length];
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < X_with_intercept.length; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            predictions[i] = calculatePrediction(X_with_intercept[i]);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        return predictions;
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 计算单个预测值
代码语言:javascript
代码运行次数:0
运行
复制
    private double calculatePrediction(double[] features) {
代码语言:javascript
代码运行次数:0
运行
复制
        double prediction = 0;
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < coefficients.length; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            prediction += features[i] * coefficients[i];
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        return prediction;
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 示例:训练并预测
代码语言:javascript
代码运行次数:0
运行
复制
    public static void main(String[] args) {
代码语言:javascript
代码运行次数:0
运行
复制
        LinearRegression model = new LinearRegression();
代码语言:javascript
代码运行次数:0
运行
复制
        // 训练数据(面积与房价)
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] X = {{50}, {70}, {100}}; // 面积
代码语言:javascript
代码运行次数:0
运行
复制
        double[] y = {150, 200, 300};       // 房价
代码语言:javascript
代码运行次数:0
运行
复制
        model.fit(X, y);
代码语言:javascript
代码运行次数:0
运行
复制
        // 预测新数据
代码语言:javascript
代码运行次数:0
运行
复制
        double[][] testData = {{60}, {80}};
代码语言:javascript
代码运行次数:0
运行
复制
        double[] predictions = model.predict(testData);
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < predictions.length; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            System.out.printf("预测房价(%d平方米): %.2f万元%n", 
代码语言:javascript
代码运行次数:0
运行
复制
                             (int) testData[i][0], predictions[i]);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
}

3. 代码解析

  • 数据预处理:通过addIntercept方法在特征矩阵中插入全1列,作为偏置项。
  • 系数计算:使用最小二乘法求解线性方程组,得到斜率与截距。
  • 预测:通过calculatePrediction方法计算新数据的预测值。

三、神经网络:AI算法的进阶

1. 算法原理

神经网络模拟人脑神经元,通过多层节点处理复杂数据。其核心过程包括:

  • 前向传播:从输入层到输出层逐层计算。
  • 反向传播:通过误差反向调整权重,优化模型性能。

2. Java实现代码

以下是一个简单的神经网络实现,包含单隐藏层与Sigmoid激活函数:

代码语言:javascript
代码运行次数:0
运行
复制
java
代码语言:javascript
代码运行次数:0
运行
复制
public class NeuralNetwork {
代码语言:javascript
代码运行次数:0
运行
复制
    private int numInputs;
代码语言:javascript
代码运行次数:0
运行
复制
    private int numHidden;
代码语言:javascript
代码运行次数:0
运行
复制
    private int numOutputs;
代码语言:javascript
代码运行次数:0
运行
复制
    private double[][] weightsInputToHidden;
代码语言:javascript
代码运行次数:0
运行
复制
    private double[][] weightsHiddenToOutput;
代码语言:javascript
代码运行次数:0
运行
复制
    // 初始化权重
代码语言:javascript
代码运行次数:0
运行
复制
    private void initializeWeights() {
代码语言:javascript
代码运行次数:0
运行
复制
        // 随机初始化权重(范围:-0.5到0.5)
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < numInputs; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            for (int j = 0; j < numHidden; j++) {
代码语言:javascript
代码运行次数:0
运行
复制
                weightsInputToHidden[i][j] = Math.random() - 0.5;
代码语言:javascript
代码运行次数:0
运行
复制
            }
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < numHidden; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            for (int j = 0; j < numOutputs; j++) {
代码语言:javascript
代码运行次数:0
运行
复制
                weightsHiddenToOutput[i][j] = Math.random() - 0.5;
代码语言:javascript
代码运行次数:0
运行
复制
            }
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 构造函数
代码语言:javascript
代码运行次数:0
运行
复制
    public NeuralNetwork(int numInputs, int numHidden, int numOutputs) {
代码语言:javascript
代码运行次数:0
运行
复制
        this.numInputs = numInputs;
代码语言:javascript
代码运行次数:0
运行
复制
        this.numHidden = numHidden;
代码语言:javascript
代码运行次数:0
运行
复制
        this.numOutputs = numOutputs;
代码语言:javascript
代码运行次数:0
运行
复制
        weightsInputToHidden = new double[numInputs][numHidden];
代码语言:javascript
代码运行次数:0
运行
复制
        weightsHiddenToOutput = new double[numHidden][numOutputs];
代码语言:javascript
代码运行次数:0
运行
复制
        initializeWeights();
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // Sigmoid激活函数
代码语言:javascript
代码运行次数:0
运行
复制
    private double sigmoid(double x) {
代码语言:javascript
代码运行次数:0
运行
复制
        return 1 / (1 + Math.exp(-x));
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 前向传播
代码语言:javascript
代码运行次数:0
运行
复制
    public double[] predict(double[] inputs) {
代码语言:javascript
代码运行次数:0
运行
复制
        double[] hiddenOutputs = new double[numHidden];
代码语言:javascript
代码运行次数:0
运行
复制
        double[] outputs = new double[numOutputs];
代码语言:javascript
代码运行次数:0
运行
复制
        // 计算隐藏层输出
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < numHidden; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            double sum = 0;
代码语言:javascript
代码运行次数:0
运行
复制
            for (int j = 0; j < numInputs; j++) {
代码语言:javascript
代码运行次数:0
运行
复制
                sum += inputs[j] * weightsInputToHidden[j][i];
代码语言:javascript
代码运行次数:0
运行
复制
            }
代码语言:javascript
代码运行次数:0
运行
复制
            hiddenOutputs[i] = sigmoid(sum);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        // 计算输出层输出
代码语言:javascript
代码运行次数:0
运行
复制
        for (int i = 0; i < numOutputs; i++) {
代码语言:javascript
代码运行次数:0
运行
复制
            double sum = 0;
代码语言:javascript
代码运行次数:0
运行
复制
            for (int j = 0; j < numHidden; j++) {
代码语言:javascript
代码运行次数:0
运行
复制
                sum += hiddenOutputs[j] * weightsHiddenToOutput[j][i];
代码语言:javascript
代码运行次数:0
运行
复制
            }
代码语言:javascript
代码运行次数:0
运行
复制
            outputs[i] = sigmoid(sum);
代码语言:javascript
代码运行次数:0
运行
复制
        }
代码语言:javascript
代码运行次数:0
运行
复制
        return outputs;
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
    // 示例:训练与预测(简化版,未实现反向传播)
代码语言:javascript
代码运行次数:0
运行
复制
    public static void main(String[] args) {
代码语言:javascript
代码运行次数:0
运行
复制
        NeuralNetwork nn = new NeuralNetwork(2, 3, 1); // 输入层2节点,隐藏层3节点,输出层1节点
代码语言:javascript
代码运行次数:0
运行
复制
        // 示例输入(假设为二分类问题)
代码语言:javascript
代码运行次数:0
运行
复制
        double[] input1 = {0, 0};
代码语言:javascript
代码运行次数:0
运行
复制
        double[] input2 = {1, 0};
代码语言:javascript
代码运行次数:0
运行
复制
        double[] input3 = {0, 1};
代码语言:javascript
代码运行次数:0
运行
复制
        double[] input4 = {1, 1};
代码语言:javascript
代码运行次数:0
运行
复制
        // 预测
代码语言:javascript
代码运行次数:0
运行
复制
        System.out.println("预测结果(输入[0,0]): " + nn.predict(input1)[0]);
代码语言:javascript
代码运行次数:0
运行
复制
        System.out.println("预测结果(输入[1,0]): " + nn.predict(input2)[0]);
代码语言:javascript
代码运行次数:0
运行
复制
        System.out.println("预测结果(输入[0,1]): " + nn.predict(input3)[0]);
代码语言:javascript
代码运行次数:0
运行
复制
        System.out.println("预测结果(输入[1,1]): " + nn.predict(input4)[0]);
代码语言:javascript
代码运行次数:0
运行
复制
    }
代码语言:javascript
代码运行次数:0
运行
复制
}

3. 代码解析

  • 初始化权重:随机初始化输入层到隐藏层、隐藏层到输出层的权重。
  • 前向传播:通过Sigmoid激活函数逐层计算输出。
  • 简化说明:此代码未实现反向传播与权重更新,实际项目中需结合梯度下降算法优化权重。

四、总结与展望

  1. 线性回归:适用于数值预测,代码实现简单,适合初学者入门。
  2. 神经网络:适合处理复杂非线性问题,但实现复杂度较高,需结合反向传播与优化算法。
  3. 未来方向
    • 尝试更复杂的神经网络结构(如CNN、RNN)。
    • 结合Java深度学习框架(如Deeplearning4j)实现大规模模型。

通过本文,读者可掌握AI算法的核心原理与Java实现方法,为进一步探索深度学习与实际应用打下基础。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • AI算法入门必学:从线性回归到神经网络,Java代码实现全解析(附完整案例)
    • 一、引言
    • 二、线性回归:AI算法的基石
      • 1. 算法原理
      • 2. Java实现代码
      • 3. 代码解析
    • 三、神经网络:AI算法的进阶
      • 1. 算法原理
      • 2. Java实现代码
      • 3. 代码解析
    • 四、总结与展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档