python 神经网络实例
#http://python.jobbole.com/82758/
# import numpy as np
#
#
# # sigmoid function
# def nonlin(x, deriv=False):
# if (deriv == True):
# return x * (1 - x)
# return 1 / (1 + np.exp(-x))
#
#
# # input dataset
# X = np.array([[0, 0, 1],
# [0, 1, 1],
# [1, 0, 1],
# [1, 1, 1]])
#
# # output dataset
# y = np.array([[0, 0, 1, 1]]).T
#
# # seed random numbers to make calculation
# # deterministic (just a good practice)
# np.random.seed(1)
#
# # initialize weights randomly with mean 0
# syn0 = 2 * np.random.random((3, 1)) - 1
#
# for iter in range(10000):
# # forward propagation
# l0 = X
# l1 = nonlin(np.dot(l0, syn0))
#
# # how much did we miss?
# l1_error = y - l1
#
# # multiply how much we missed by the
# # slope of the sigmoid at the values in l1
# l1_delta = l1_error * nonlin(l1, True)
#
# # update weights
# syn0 += np.dot(l0.T, l1_delta)#反向传播,w = w + f(y) * l1_delta
# print("Output After Training:")
# print(l1) import numpy as np def nonlin(x, deriv=False):
if (deriv == True):
return x * (1 - x) return 1 / (1 + np.exp(-x)) X = np.array([[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]]) y = np.array([[0],
[1],
[1],
[0]]) np.random.seed(1) # randomly initialize our weights with mean 0
syn0 = 2 * np.random.random((3, 4)) - 1
syn1 = 2 * np.random.random((4, 1)) - 1 for j in range(60000): # Feed forward through layers 0, 1, and 2
l0 = X
l1 = nonlin(np.dot(l0, syn0))
l2 = nonlin(np.dot(l1, syn1)) # how much did we miss the target value?
l2_error = y - l2 if (j % 10000) == 0:
print("Error:" + str(np.mean(np.abs(l2_error)))) # in what direction is the target value?
# were we really sure? if so, don't change too much.
l2_delta = l2_error * nonlin(l2, deriv=True) # how much did each l1 value contribute to the l2 error (according to the weights)?
l1_error = l2_delta.dot(syn1.T) # in what direction is the target l1?
# were we really sure? if so, don't change too much.
l1_delta = l1_error * nonlin(l1, deriv=True) syn1 += l1.T.dot(l2_delta)
syn0 += l0.T.dot(l1_delta) print("Output After Training:")
print(l2)
# 1.
# 关于非线性转化方程(non - linear
# transformation
# function)
#
# sigmoid函数(S
# 曲线)用来作为activation
# function:
#
# 1.1
# 双曲函数(tanh)
#
# 1.2
# 逻辑函数(logistic
# function)
#
#
# 2.
# 实现一个简单的神经网络算法 import numpy as np def tanh(x):
return np.tanh(x) def tanh_deriv(x):
return 1.0 - np.tanh(x) * np.tanh(x) def logistic(x):
return 1 / (1 + np.exp(-x)) def logistic_derivative(x):
return logistic(x) * (1 - logistic(x)) class NeuralNetwork:
def __init__(self, layers, activation='tanh'):
"""
:param layers: A list containing the number of units in each layer.
Should be at least two values
:param activation: The activation function to be used. Can be
"logistic" or "tanh"
"""
if activation == 'logistic':
self.activation = logistic
self.activation_deriv = logistic_derivative
elif activation == 'tanh':
self.activation = tanh
self.activation_deriv = tanh_deriv self.weights = []
for i in range(1, len(layers) - 1):
#layers[i - 1]为前一输入层节点数 +1是加上一个偏置点,
#layers[i]为当前层的输出节点数 +1是加上一个偏置点,
self.weights.append((2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
self.weights.append((2 * np.random.random((layers[i] + 1, layers[i + 1])) - 1) * 0.25) def fit(self, X, y, learning_rate=0.2, epochs=10000):
X = np.atleast_2d(X) #判断输入训练集是否为二维
temp = np.ones([X.shape[0], X.shape[1] + 1])
temp[:, 0:-1] = X # adding the bias unit to the input layer
X = temp
y = np.array(y) for k in range(epochs):
i = np.random.randint(X.shape[0])
a = [X[i]] #len(self.weights)为输出节点个数,每个输出节点对应了一组权值是weight中的一行self.weights[l]
for l in range(len(self.weights)): # going forward network, for each layer
# Computer the node value for each layer (O_i) using activation function
# a[l] 为输入数据的特征值 print(a[l])
print(self.weights[l])
a.append(self.activation(np.dot(a[l], self.weights[l]))) error = y[i] - a[-1] # Computer the error at the top layer
deltas = [error * self.activation_deriv(a[-1])] # For output layer, Err calculation (delta is updated error) # Staring backprobagation
for l in range(len(a) - 2, 0, -1): # we need to begin at the second to last layer
# Compute the updated error (i,e, deltas) for each node going from top layer to input layer
deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_deriv(a[l]))
deltas.reverse()
for i in range(len(self.weights)):
layer = np.atleast_2d(a[i])
delta = np.atleast_2d(deltas[i])
self.weights[i] += learning_rate * layer.T.dot(delta) def predict(self, x):
x = np.array(x)
temp = np.ones(x.shape[0] + 1)
temp[0:-1] = x
a = temp
for l in range(0, len(self.weights)):
a = self.activation(np.dot(a, self.weights[l]))
return a print("简单非线性关系数据集测试(XOR)")
# 1. 简单非线性关系数据集测试(XOR):
#
# X: Y
# 0 0 0
# 0 1 1
# 1 0 1
# 1 1 0 #from NeuralNetwork import NeuralNetwork
import numpy as np nn = NeuralNetwork([2,2,1], 'tanh')
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in [[0, 0], [0, 1], [1, 0], [1,1]]:
print(i, nn.predict(i)) print("\n\n手写数字识别")
# 2. 手写数字识别:
#
# 每个图片8x8
# 识别数字:0,1,2,3,4,5,6,7,8,9 import numpy as np
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import LabelBinarizer
#from NeuralNetwork import NeuralNetwork
from sklearn.cross_validation import train_test_split digits = load_digits()
X = digits.data
y = digits.target
X -= X.min() # normalize the values to bring them into the range 0-1
X /= X.max() nn = NeuralNetwork([64,100,10],'logistic')
X_train, X_test, y_train, y_test = train_test_split(X, y)
labels_train = LabelBinarizer().fit_transform(y_train)
labels_test = LabelBinarizer().fit_transform(y_test)
print("start fitting")
nn.fit(X_train,labels_train,epochs=3000)
predictions = []
for i in range(X_test.shape[0]):
o = nn.predict(X_test[i] )
predictions.append(np.argmax(o))
print (confusion_matrix(y_test,predictions))
print (classification_report(y_test,predictions))
python 神经网络实例的更多相关文章
- 学习推荐《Python神经网络编程》中文版PDF+英文版PDF+源代码
推荐非常适合入门神经网络编程的一本书<Python神经网络编程>,主要是三部分: 介绍神经网络的基本原理和知识:用Python写一个神经网络训练识别手写数字:对识别手写数字的程序的一些优化 ...
- python基础——实例属性和类属性
python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...
- python 发送邮件实例
留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例
- python Cmd实例之网络爬虫应用
python Cmd实例之网络爬虫应用 标签(空格分隔): python Cmd 爬虫 废话少说,直接上代码 # encoding=utf-8 import os import multiproces ...
- Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取
很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
- python 创建实例--待完善
今天好好琢磨一下 python 创建实例的先后顺序 一. 就定义一个普通类 Util (默认)继承自 object,覆写 new ,init 方法 class Util(object): def __ ...
- pcapng文件的python解析实例以及抓包补遗
为了弥补pcap文件的缺陷,让抓包文件可以容纳更多的信息,pcapng格式应运而生.关于它的介绍详见<PCAP Next Generation Dump File Format> 当前的w ...
随机推荐
- Python Web Scraper - Simple Url Request
from urllib.request import urlopen html = urlopen("http://www.baidu.com") print(html.read( ...
- 安卓平台ARM Mali OpenCL例子-灰度转换(转)
手头一块RK3288的板子,在板子上测试了一张1080p的彩色图灰度转换的OpenCL例子.OpenCL没有任何优化.例子请移步这里. 该例子是编译成安卓平台下的可执行程序. 进入jni文件夹,进行如 ...
- FastDFS简易概括
FastDFS是一个文件系统,可以部署在Linux上. 该文件系统具备高可用和负载均衡特性,还可以动态扩充容量. 此文件系统有两个服务组成:跟踪服务和存储服务,也就是说你必须部署了这两种服务,这个文件 ...
- 用Drupal快速实现mobile平台服务端【转】
原文地址:http://www.terrysco.com/node/drupal-as-mobile-backend.html 用Drupal很容易实现一个API,让手机平台或者其他系统使用json的 ...
- 【Linux】centos和ubuntu下php5安装redis2.24扩展
1.服务器先安装redis-server,这是毋庸置疑的!!! 2.服务器开启redis-server,配置相关参数 3.配置好redis服务器后,再安装php的redis扩展phpredis. 一. ...
- 如何用原生js或jquery设置select的值
1.原生js设置select值的方法 (1)有时可能需要隐藏select,但是还得需要更改select所传递的值.(select的默认选中之为第一个,即下标为0的选项值) var gd2=docume ...
- SQL SERVER 2005允许自定义聚合函数
不多说了,说明后面是完整的代码,用来将字符串型的字段的各行的值拼成一个大字符串,也就是通常所说的Concat 例如有如下表dict ID NAME CATEGORY 1 RED COLOR ...
- 输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)
一.以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符.把它们作为插入操作符<<的输出对象即可.如setiosflags.setw.set ...
- quartz cron表达式在线生成
近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...
- 从JavaScript 数组去重看兼容性有关问题,及性能优化(摘自玉伯博客)
JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScr ...