`
zhoupinheng
  • 浏览: 36133 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java实现逻辑回归

阅读更多

pom.xml

		<!-- 用于矩阵运算 -->
                <dependency>
			<groupId>org.ujmp</groupId>
			<artifactId>ujmp-core</artifactId>
			<version>0.3.0</version>
		</dependency>
                <!-- 用于显示散点图-->
		<dependency>
			<groupId>org.jfree</groupId>
			<artifactId>jfreechart</artifactId>
			<version>1.5.0</version>
		</dependency>

 

    LogisticRegression主类

package logisticregression;

import org.ujmp.core.DenseMatrix;
import org.ujmp.core.Matrix;

public class LogisticRegression {

	public static double[] train(double[][] data, double[] classValues) {

		if (data != null && classValues != null && data.length == classValues.length) {
			Matrix matrWeights = DenseMatrix.Factory.zeros(data[0].length + 1, 1);
			Matrix matrData = DenseMatrix.Factory.zeros(data.length, data[0].length + 1);
			Matrix matrLable = DenseMatrix.Factory.zeros(data.length, 1);
			for (int i = 0; i < data.length; i++) {
				matrData.setAsDouble(1.0, i, 0);
				matrLable.setAsDouble(classValues[i], i, 0);
				for (int j = 0; j < data[0].length; j++) {
					matrData.setAsDouble(data[i][j], i, j + 1);
					if (i == 0) {
						matrWeights.setAsDouble(1.0, j, 0);

					}
				}
			}
			matrWeights.setAsDouble(-0.5, data[0].length, 0);

			double step = 0.01;
			int maxCycle = 5000000;

			for (int i = 0; i < maxCycle; i++) {
				Matrix h = sigmoid(matrData.mtimes(matrWeights));
				Matrix difference = matrLable.minus(h);
				matrWeights = matrWeights.plus(matrData.transpose().mtimes(difference).times(step));
			}

			double[] rtn = new double[(int) matrWeights.getRowCount()];
			for (long i = 0; i < matrWeights.getRowCount(); i++) {
				rtn[(int) i] = matrWeights.getAsDouble(i, 0);
			}

			return rtn;

		}

		return null;
	}

	public static Matrix sigmoid(Matrix sourceMatrix) {
		Matrix rtn = DenseMatrix.Factory.zeros(sourceMatrix.getRowCount(), sourceMatrix.getColumnCount());
		for (int i = 0; i < sourceMatrix.getRowCount(); i++) {
			for (int j = 0; j < sourceMatrix.getColumnCount(); j++) {
				rtn.setAsDouble(sigmoid(sourceMatrix.getAsDouble(i, j)), i, j);
			}

		}

		return rtn;
	}

	public static double sigmoid(double source) {
		return 1.0 / (1 + Math.exp(-1 * source));
	}

	public static double getValue(double[] sourceData, double[] model) {
		double logisticRegressionValue = model[0];
		for (int i = 0; i < sourceData.length; i++) {
			logisticRegressionValue = logisticRegressionValue + sourceData[i] * model[i + 1];
		}
		logisticRegressionValue = sigmoid(logisticRegressionValue);

		return logisticRegressionValue;
	}

}

 

    逻辑回归测试类

package logisticregression;

import common.ScatterPlot;

public class LogisicRegressionTest {

	public static void main(String[] args) {
		double[][] sourceData = new double[][] { { -1, 1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 0, 0.1 }, { 0, -0.1 }, { -1, -1.1 }, { 1, 0.9 } };
		double[] classValue = new double[] { 1, 1, 0, 0, 1, 0, 0, 0 };
		double[] modle = LogisticRegression.train(sourceData, classValue);
		double logicValue = LogisticRegression.getValue(new double[] { 0, 0 }, modle);
		System.out.println("---model---");
		for (int i = 0; i < modle.length; i++) {
			System.out.println(modle[i]);
		}
		System.out.println("-----------");
		System.out.println(logicValue);

		double[][][] chartData = new double[3][][];
		double[][] c0 = new double[2][5];
		double[][] c1 = new double[2][3];
		c1[0][0] = sourceData[0][0];
		c1[1][0] = sourceData[0][1];

		c1[0][1] = sourceData[1][0];
		c1[1][1] = sourceData[1][1];

		c0[0][0] = sourceData[2][0];
		c0[1][0] = sourceData[2][1];

		c0[0][1] = sourceData[3][0];
		c0[1][1] = sourceData[3][1];

		c1[0][2] = sourceData[4][0];
		c1[1][2] = sourceData[4][1];

		c0[0][2] = sourceData[5][0];
		c0[1][2] = sourceData[5][1];

		c0[0][3] = sourceData[6][0];
		c0[1][3] = sourceData[6][1];

		c0[0][4] = sourceData[7][0];
		c0[1][4] = sourceData[7][1];

		String[] c = new String[] { "1", "0", "L" };
		double[][] c2 = new double[2][21];
		int ind = 0;
		for (double x = -1; x <= 1; x = x + 0.1) {
			c2[0][ind] = x;
			c2[1][ind] = (-modle[0] - modle[1] * x) / modle[2];
			ind++;
		}

		chartData[0] = c0;
		chartData[1] = c1;
		chartData[2] = c2;

		ScatterPlot.showScatterPlotChart("LogisticRegression", c, chartData);

	}

}

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java实现逻辑回归算法(LogRegression)对iris数据集分类

    **Java实现逻辑回归算法(Logistic Regression)对Iris数据集分类** 在机器学习领域,逻辑回归是一种广泛应用的分类算法,尤其适用于二分类问题。它的基本思想是通过拟合一个Sigmoid函数来预测事件发生的概率。这里,...

    java 实现逻辑回归,附带训练集,详解回归算法-LR

    在本文中,我们将深入探讨如何使用Java实现逻辑回归(LR),这是一种广泛应用的二分类模型,广泛用于各种领域,包括预测模型、医学诊断、市场分析等。逻辑回归属于监督学习算法,其目标是根据一组自变量x来预测一个...

    java实现logistic回归算法

    - **Deeplearning4j**:虽然主要用于深度学习,但其也支持逻辑回归模型的构建。 5. **代码实现示例** 在Java中,你可以先定义一个数据类,然后创建一个LogisticRegression类,包含初始化、训练、预测等方法。训练...

    JELR.zip_java 回归_java 逻辑回归_回归java实现_逻辑回归_逻辑回归 java

    JELR项目中包含了这些改进,可以提供一个更高效、更适应特定场景的逻辑回归实现。如果需要深入研究或使用这些特性,建议查看源码并理解其实现细节。 总结来说,Java实现的逻辑回归不仅可以处理二分类问题,还能通过...

    Java实现逻辑回归(对iris数据集分类)_LogisticRegression.zip

    Java实现逻辑回归(对iris数据集分类)_LogisticRegression

    机器学习 LR逻辑回归算法

    综上所述,逻辑回归在机器学习中占有重要地位,而用Java实现逻辑回归则需要理解数据预处理、模型构建、优化算法等关键概念,并能够熟练运用相关的Java库。通过训练和评估,我们可以构建一个有效的分类模型,用于预测...

    logistic regression 超详细java代码 带 数据集

    - 在Java中,我们可以使用Apache Commons Math库来实现逻辑回归的数学计算,如矩阵运算、梯度上升法等。 - 首先,需要定义模型参数,包括权重向量和截距项。 - 定义损失函数(如交叉熵损失)和梯度函数,这是优化...

    ML 逻辑回归

    综上所述,逻辑回归是一种简单而强大的分类算法,通过Sigmoid函数实现非线性映射,可用于处理二分类问题。通过优化损失函数,我们可以得到最佳的模型参数,从而实现对新数据的有效预测。在实际应用中,理解并掌握...

    逻辑斯蒂回归模型,java

    在Java中实现逻辑斯蒂回归,我们需要理解其基本原理和步骤,同时掌握相关的编程技巧。 首先,我们要了解逻辑斯蒂回归的核心思想。它的输出是介于0和1之间的概率值,通过sigmoid函数(也称为 logistic 函数)将线性...

    logistic_regression_Logistic_逻辑回归并行算法大数据_accuratebdn_

    在这个项目中,"logistic_regression_Logistic_逻辑回归并行算法大数据_accuratebdn_" 提到了逻辑回归的并行实现,这通常是为了处理大规模数据集而设计的,因为传统的单机算法可能在大数据量下效率低下。 项目中...

    Logistic-Regression:逻辑回归的实现

    在Java中实现逻辑回归,通常会采用梯度下降法或最大似然估计法来求解模型参数。梯度下降法通过迭代更新参数,使得损失函数(通常是对数似然损失函数)逐渐减小,直到达到局部最优或全局最优。最大似然估计法则尝试...

    逻辑回归算法检测Java溢出攻击.zip

    《逻辑回归算法在Java溢出攻击检测中的应用》 在当今的网络安全领域,Java溢出攻击作为一种常见的黑客入侵手段,给系统安全带来了严重威胁。为了有效地预防和应对这些攻击,机器学习技术,尤其是逻辑回归算法,被...

    Main_LR分类_逻辑回归_

    1. **库的选择**:Java中可以使用Weka、Apache Commons Math、OpenCV、Smile Machine Learning等库来实现逻辑回归。这里我们以Weka为例,Weka提供了一个强大的机器学习工具箱,包括多种算法和数据预处理方法。 2. **...

    logistic-regression-java:Java中的逻辑回归

    逻辑回归-java Logistic Regression Java 类,可用于单个或多个逻辑回归分析。 通过计算所使用的每个预测变量的优势比和 logit 来估计 beta 系数。

    决策树Java代码实现

    根据提供的文件信息,我们可以深入探讨决策树在Java中的实现细节及其关键组成部分。决策树是一种常用的机器学习方法,用于分类和回归任务。它通过构建一棵树形结构来表示一系列的判断逻辑,进而对未知数据进行预测。...

    Java-ml:使用Java和Weka进行线性回归,逻辑和NaiveBayes分类的机器学习应用程序

    入门欢迎来到VS Code Java世界。 这是一条指南,可帮助您开始在Visual Studio Code中编写Java代码。资料夹结构默认情况下,工作区包含两个文件夹,其中: src :用于维护源的文件夹lib :用于维护依赖关系的文件夹...

    机器学习算法的java实现

    机器学习算法本身是一个广义的概念,包括了各种统计学习方法,如线性回归、逻辑回归、支持向量机、决策树、随机森林、神经网络等。在Java中实现这些算法,不仅需要对算法本身有深刻的理解,也需要对Java编程有良好的...

    AdaBoost算法java实现

    2. **弱分类器**: 实现弱分类器的接口,例如决策树(如ID3、C4.5)或线性模型(如逻辑回归)。 3. **权重更新**: 编写函数来根据弱分类器的表现更新样本权重。 4. **加权错误率计算**: 实现计算加权错误率的函数。...

    NJUST机器学习课后作业python实现-朴素贝叶斯-神经网络-感知机-softmax回归-逻辑回归+源代码+文档说明

    1、资源内容:NJUST机器学习课后作业python实现-朴素贝叶斯-神经网络-感知机-softmax回归-逻辑回归+源代码+文档说明 2、代码特点:内含运行结果,不会运行可私信,参数化编程、参数可方便更改、代码编程思路清晰、...

    ARIMA时间序列理论基础+JAVA代码实现

    实际代码实现会涉及到具体的API调用和数据处理逻辑,这里不做详细展示,但上述步骤可以作为编写Java代码的指导。 总之,ARIMA模型在时间序列预测中起着关键作用,而Java作为一种通用编程语言,提供了实现这一模型的...

Global site tag (gtag.js) - Google Analytics