机器学习算法 java
无人驾驶汽车,面部检测软件和语音控制扬声器均基于机器学习技术和框架构建,而这些仅仅是第一波。 在接下来的十年中,新一代产品将改变我们的世界,为软件开发以及我们创建和使用的应用程序和产品启动新的方法。
作为Java开发人员,您想超越这一曲线,特别是因为高科技公司开始认真地投资于机器学习。 今天所学的内容,可以在未来五年内继续发展,但是必须从某个地方开始。
本文将帮助您入门。 您将首先对机器学习的工作方式有一个第一印象,然后是实现和训练机器学习算法的简短指南。 在研究了学习算法和可用于训练,评分和选择最适合的预测功能的功能的内部之后,您将获得使用JVM框架Weka构建机器学习解决方案的概述。 本文重点介绍有监督的机器学习,这是开发智能应用程序的最常用方法。
Java开发人员的机器学习,第2部分
您准备好下一步了吗? 本教程的后半部分向您展示如何开发和部署机器学习数据管道。
机器学习和人工智能
机器学习已经从人工智能领域发展而来,该领域旨在生产能够模仿人类智能的机器。 尽管机器学习是计算机科学中的新兴趋势,但人工智能并不是一个新的科学领域。 由Alan Turing在1950年代初期开发的Turing测试是为确定计算机是否具有真实智能而创建的首批测试之一。 根据图灵测试,一台计算机可以通过欺骗人们以为它也是人类来证明人类的智慧。
许多最先进的机器学习方法都基于数十年的概念。 在过去十年中发生的变化是,计算机(和分布式计算平台)现在具有机器学习算法所需的处理能力。 大多数机器学习算法都需要处理大量的矩阵乘法和其他数学运算。 用于管理这些计算的计算技术甚至在二十年前还不存在,但是今天已经存在。
机器学习使程序可以执行质量改进过程并扩展其功能,而无需人工参与。 使用机器学习构建的程序能够更新或扩展自己的代码。
监督学习与无监督学习
监督学习和无监督学习是最流行的机器学习方法。 两者都需要向机器提供大量数据记录以进行关联并从中学习。 这种收集的数据记录通常称为特征向量。 对于单独的房屋,特征向量可能包括诸如房屋的整体大小,房间数量和房屋的年龄之类的特征。
在监督学习中 ,训练了机器学习算法以正确响应与特征向量有关的问题。 为了训练算法,向机器提供一组特征向量和一个关联的标签。 标签通常由人工注释者提供,代表给定问题的正确“答案”。 学习算法分析特征向量及其正确的标签,以找到它们之间的内部结构和关系。 因此,机器学习正确响应查询。
例如,可以使用特征向量来训练智能房地产应用程序,这些特征向量包括一系列房屋的大小,房间数量和各自的年龄。 贴标签的人会根据这些因素为每个房屋贴上正确的房价。 通过分析这些数据,将对房地产应用程序进行培训,以回答以下问题:“ 我能为这所房子多少钱? ”
培训过程结束后,将不会标记新的输入数据。 即使对于看不见的,未标记的特征向量,机器也将能够正确响应查询。
在无监督学习中 ,对算法进行编程以预测答案而无需人工标记甚至问题。 非监督学习不是预先确定标签或结果是什么,而是利用海量数据集和处理能力来发现以前未知的相关性。 例如,在消费产品营销中,无监督学习可用于识别隐藏的关系或消费者分组,最终导致新的或改进的营销策略。
本文重点介绍有监督的机器学习,这是当今最常见的机器学习方法。
有监督的机器学习
所有机器学习都基于数据。 对于有监督的机器学习项目,您将需要以有意义的方式为所需的结果标记数据。 在表1中,请注意,房屋记录的每一行都包含“房屋价格”标签。 通过将行数据与房屋价格标签相关联,该算法最终将能够预测不在其数据集中的房屋的市场价格(请注意,房屋大小基于平方米,房屋价格基于欧元)。
表1.房屋记录
特征 | 特征 | 特征 | 标签 |
房子大小 | 房间的数量 | 房屋年龄 | 房屋概算 |
为90m 2 /295英尺 | 2间 | 23年 | 249,000€ |
101米2 /331英尺 | 3间 | 不适用 | 338,000€ |
1330平方米/ 4363英尺 | 11间 | 12年 | 6,500,000€ |
在早期阶段,您可能会手工标记数据记录,但最终可能会训练程序以使此过程自动化。 您可能已经在电子邮件应用程序中看到了这种情况,将电子邮件移入垃圾邮件文件夹会导致查询“这是垃圾邮件吗?”。 当您回复时,您正在训练程序以识别您不想看到的邮件。 该应用程序的垃圾邮件过滤器学习如何标记来自相同来源或承载相似内容的将来的邮件并进行处理。
带标签的数据集仅用于培训和测试目的。 此阶段结束后,机器学习算法将在未标记的数据实例上工作。 例如,您可以向预测算法提供新的,未标记的房屋记录,并且它将根据训练数据自动预测预期的房屋价格。
机器如何学习预测
监督式机器学习的挑战是为特定问题找到合适的预测功能。 从数学上讲,挑战在于找到采用输入变量x并返回预测值y的输入输出函数。 该假设函数 ( hθ )是训练过程的输出。 通常,假设函数也称为目标函数或预测函数。
格里戈尔·罗斯(Gregor Roth)
图1.目标函数
在大多数情况下, x表示多数据点。 在我们的示例中,这可能是由房屋大小值和房间数量值定义的单个房屋的二维数据点。 这些值的数组称为特征向量 。 给定一个具体的目标函数,该函数可用于对每个特征向量x进行预测。 要预测单个房屋的价格,可以使用包含房屋大小和房间数量的特征向量{101.0,3.0}调用目标函数:
// target function h (which is the output of the learn process)
Function<Double[], Double> h = ...;
// set the feature vector with house size=101 and number-of-rooms=3
Double[] x = new Double[] { 101.0, 3.0 };
// and predicted the house price (label)
double y = h.apply(x);
// target function h (which is the output of the learn process)
Function<Double[], Double> h = ...;
// set the feature vector with house size=101 and number-of-rooms=3
Double[] x = new Double[] { 101.0, 3.0 };
// and predicted the house price (label)
double y = h.apply(x);
在清单1中,数组变量x值表示房屋的特征向量。 目标函数返回的y值是预测的房价。
机器学习的挑战是定义一个目标函数,该函数对于未知的,看不见的数据实例将尽可能准确地工作。 在机器学习中,目标函数( hθ )有时被称为模型 。 该模型是学习过程的结果。
格里戈尔·罗斯(Gregor Roth)
图2.机器学习模型
基于标记的训练示例,学习算法在训练数据中查找结构或模式。 根据这些数据,可以得出一个可以从该数据很好地概括的模型。
通常,学习过程是探索性的 。 在大多数情况下,将通过使用学习算法和配置的不同变体来多次执行该过程。
最终,将基于性能指标评估所有模型,并选择最佳模型。 然后,该模型将用于计算未来未标记数据实例的预测。
线性回归
要训练机器思考,第一步是选择将要使用的学习算法。 线性回归是最简单,最受欢迎的监督学习算法之一。 该算法假定输入要素和输出标签之间的关系是线性的 。 下面的通用线性回归函数通过汇总特征向量的每个元素乘以theta参数(θ)来返回预测值。 theta参数在训练过程中用于根据训练数据调整或“调整”回归函数。
格里戈尔·罗斯(Gregor Roth)
图3.通用线性回归函数
在线性回归函数中,theta参数和特征参数由订阅号枚举。 订阅号指示矢量中theta参数(θ)和特征参数(x)的位置。 请注意,出于计算目的,特征x 0是设置值为1的常数偏移项。 结果,特定于域的特征的索引(例如房屋大小)将从x 1开始。 例如,如果将x 1设置为房屋特征向量的第一个值(房屋大小),则将x 2设置为下一个值(房间数等)。
清单2显示了此线性回归函数的Java实现,以数学方式表示为hθ (x)。 为简单起见,使用数据类型double
进行计算。 在apply()
方法中,期望在该函数之外将数组的第一个元素设置为1.0。
清单2. Java中的线性回归
public class LinearRegressionFunction implements Function<Double[], Double> {
private final double[] thetaVector;
LinearRegressionFunction(double[] thetaVector) {
this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
}
public Double apply(Double[] featureVector) {
// for computational reasons the first element has to be 1.0
assert featureVector[0] == 1.0;
// simple, sequential implementation
double prediction = 0;
for (int j = 0; j < thetaVector.length; j++) {
prediction += thetaVector[j] * featureVector[j];
}
return prediction;
}
public double[] getThetas() {
return Arrays.copyOf(thetaVector, thetaVector.length);
}
}
public class LinearRegressionFunction implements Function<Double[], Double> {
private final double[] thetaVector;
LinearRegressionFunction(double[] thetaVector) {
this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
}
public Double apply(Double[] featureVector) {
// for computational reasons the first element has to be 1.0
assert featureVector[0] == 1.0;
// simple, sequential implementation
double prediction = 0;
for (int j = 0; j < thetaVector.length; j++) {
prediction += thetaVector[j] * featureVector[j];
}
return prediction;
}
public double[] getThetas() {
return Arrays.copyOf(thetaVector, thetaVector.length);
}
}
为了创建LinearRegressionFunction
的新实例,必须设置theta参数。 theta参数或向量用于将通用回归函数调整为基础训练数据。 程序的theta参数将在学习过程中根据训练示例进行调整。 训练目标功能的质量只能与给定训练数据的质量一样好。
在下面的示例中,将实例化LinearRegressionFunction
以根据房屋大小预测房屋价格。 考虑到x 0必须为1.0的常数,使用两个theta参数实例化目标函数。 theta参数是学习过程的输出。 创建新实例后,将对1330平方米大小的房屋的价格进行如下预测:
// the theta vector used here was output of a train process
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);
// create the feature vector function with x0=1 (for computational reasons) and x1=house-size
Double[] featureVector = new Double[] { 1.0, 1330.0 };
// make the prediction
double predictedPrice = targetFunction.apply(featureVector);
// the theta vector used here was output of a train process
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);
// create the feature vector function with x0=1 (for computational reasons) and x1=house-size
Double[] featureVector = new Double[] { 1.0, 1330.0 };
// make the prediction
double predictedPrice = targetFunction.apply(featureVector);
目标函数的预测线在下表中显示为蓝线。 通过执行所有房屋尺寸值的目标函数来计算该线。 该图表还包括用于培训的价格大小对。
格里戈尔·罗斯(Gregor Roth)
图4.目标函数的预测线
到目前为止,预测图似乎非常合适。 图形坐标(截距和斜率)由theta向量{ 1.004579, 5.286822 }
。 但是您怎么知道这个theta向量最适合您的应用? 如果更改了第一个或第二个theta参数,该函数是否会更合适? 为了确定最合适的theta参数向量,您需要一个效用函数 ,它将评估目标函数的执行情况。
对目标功能进行评分
在机器学习中, 成本函数 (J(θ))用于计算平均误差或给定目标函数的“成本”。
格里戈尔·罗斯(Gregor Roth)
图5.成本函数
翻译自: https://www.infoworld.com/article/3224505/machine-learning-for-java-developers.html
机器学习算法 java