全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1227 0
2020-11-30
使用Smile对神经网络进行数据分类
数据分类是用于对数据进行排序,理解数据和执行结果预测的中央数据挖掘技术。在这个小型博客中,我们将使用Smilec库,该库包含许多用于监督和非监督数据分类方法的方法。我们将使用Jython top制作类似Python的小型代码,以构建一个复杂的多层感知器神经网络进行数据分类。它具有大量的输入,多个输出,并且可以轻松扩展为具有许多隐藏层的情况。我们将编写几行Jython代码(我们的大多数编写工作将涉及如何准备用于读取数据的接口,而不是神经网络编程)。
首先,让我们复制数据样本。一个样本用于培训,另一个文件用于测试 将这些文件复制到本地目录。我们将使用通常的Python样式导入要在本示例中使用的必需类,以导入:
from smile.data import AttributeDataset
from smile.data.parser import DelimitedTextParser
from smile.classification import NeuralNetwork
from smile.math import Math
from jarray import zeros
from jhplot import *
import java
我们从几个包中导入了几个类:“ smile”,“ jhplot”和Java。额外的软件包“ jarray”用于使用Jython处理Java数组。对于我们的示例,NeuralNetwork类是最重要的。它创建了多层感知器神经网络,该网络由多层节点组成,这些节点通过加权的无环弧从上一层到下一层相互连接。我们将其称为:
nn=[Nr_input
net.learn(x
在这里,我们使用逻辑Sigmoid函数和错误函数“ LEAST_MEAN_SQUARES”。在开始使用此NN之前,我们将从文件中读取数据,并创建输入数组x,y。我们将编写一个小的函数“ getJavaArrays”,该函数返回两个数组double [] []和int [](使用Java样式)。训练完NN后,我们将使用测试样本并调用方法“ predict(x)”以验证我们的预测是否接近测试样本的预期值。
完整的代码如下所示:
from smile.data import AttributeDataset
from smile.data.parser import DelimitedTextParser
from smile.classification import NeuralNetwork
from smile.math import Math
from jarray import zeros
from jhplot import *
import java
def getJavaArrays(dataset): # this function create x[][] and y[] array from datasets
    rows=dataset.size()
    lst = [0.0]*rows
    twoDimArr = array([lst
    x = dataset.toArray(twoDimArr)
    y = dataset.toArray(zeros(rows
    return x
parser =DelimitedTextParser(); parser.setDelimiter("[\t ]+")
parser.setResponseIndex(NominalAttribute("class")
train=parser.parse("Train"
x
print "Rescale data range .. "
p = len(x[0])
mu = Math.colMeans(x);
sd = Math.colSds(x);
for i in range(len(x)):
   for j in range(p):
      x[i][j] = (x[i][j] - mu[j]) / sd[j];
nin=len(x[0]); nout=Math.max(y)+1
print "Training: Nr for input layer="
nn=[nin
print "NN layout="
net = NeuralNetwork(NeuralNetwork.ErrorFunction.LEAST_MEAN_SQUARES
c1 = SPlot() # plot error vs epoch
c1.visible(); c1.setGTitle("Neural Network output error")
c1.setAutoRange(); c1.setMarksStyle('various')
c1.setConnected(1
for j in range(70): # 70 is max value for epoch
   net.learn(x
   error=0.0
   for i in range(len(x)):
      if (net.predict(x[i]) != y[i]): error +=1
   error=error / len(x)
   c1.addPoint(0
   c1.update()
print "Epoch="
print "Testing using zip.test file.."
test=parser.parse("Test"
testx
for i in range(len(testx)): # rescale data
   for j in range(p):
      testx[i][j] = (testx[i][j] - mu[j]) / sd[j];
error=0.0
for i in range(len(testx)):
   if (net.predict(testx[i]) != testy[i]): error +=1
print "Error rate ="
请注意,我们使用一个包含50个隐藏节点的隐藏层。输入(256)和输出(10)的数量由数据的结构给定(查看数据文件以了解其结构)。
现在,您可以使用DMelt数据程序(dmelt)运行此示例。安装DMelt,在编辑器中打开上面的代码,并将其保存在扩展名为“ .py”的文件中(例如,作为“ test.py”文件)。此扩展很重要,因为它告诉DMelt如何运行此代码。然后运行该文件:单击顶部菜单中带有绿色奔跑者的按钮,或按[F8]。您将看到一幅图像,该图像显示学习错误如何随着时间的推移而缩小。代码的最后一行给出了预测的错误率。
如果您对深度神经网络感兴趣,请使用输入列表来增加隐藏层的数量。例如,此设置具有2个隐藏层,分别具有50和25个节点:
nn=[nin
如果您看到将大大减少时期数以获得成功预测的相似(或更佳)速率(但CPU时间将增加,因为需要更多时间来调整权重)。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群