python线性卷积函数 线性卷积的求法

pytorch全连接层计算时间短

1.读取数据

创新互联是一家集网站建设,闽侯企业网站建设,闽侯品牌网站建设,网站定制,闽侯网站建设报价,网络营销,网络优化,闽侯网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

首先,引入必要的头文件,并从文件中读入数据:

import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import torch import torch.nn as nn from torch.autograd import Variable df = pd.read_csv('data/AirPassengers.csv') plt.plot(df['#Passengers']) plt.show()

程序输出如下图所示:

2.归一化

无论机器学习还是深度学习,使用哪一种框架,归一化都是必要环节。归一化的目标是将每一维特征压缩到一定范围之内,以免不同特征因取值范围不同而影响其权重。非常大或非常小的值搭配上不恰当的学习率,往往使得收敛过慢,或者因每次调整的波动太大最终无法收敛。归一化去除了这些不稳定因素。

归一化的具体做法是将某一列特征转换成均值为 0、标准差为1的数据,在图像处理过程中,也常把0-255之间的颜色值转换为0-1之间的小数。

本例中使用了均值和标准差编写了归一化和反归一化函数:

def feature_normalize(data): mu = np.mean(data,axis=0) # 均值 std = np.std(data,axis=0) # 标准差 return (data - mu)/std def feature_unnormalize(data, arr): mu = np.mean(data,axis=0) std = np.std(data,axis=0) return arr * std + mu

3.提取新特征

提取新特征是指从现有特征中提取更多可以代入模型的信息,从而生成新特征,本例中的数据包括两列,第一列“Month”是字符串类型的时间,第二列“#Passengers”是乘客量,也就是需要预测的数据y。下面通过拆分和类型转换,从第一列中提取具体的年“year”和月“mon”,将索引列变为特征“x”,并使用上面定义的函数实现归一化功能。

df['year'] = df['Month'].apply(lambda x: float(x[:4])) df['mon'] = df['Month'].apply(lambda x: float(x[5:])) df['x'] = feature_normalize(df.index) df['y'] = feature_normalize(df['#Passengers']) df['year'] = feature_normalize(df['year']) df['mon'] = feature_normalize(df['mon']) df['real'] = feature_unnormalize(df['#Passengers'], df['y'])

处理后的数据如下图所示:

4.处理缺失值和异常值

处理缺失值和异常值也是特征工程的重要环节,有时花费的时间比建模还多。处理缺失值的常用方法是删除重要特征缺失的item,或者用均值,前后值填充;处理异常值是监测数据中不正常的值,并做出相应处理,由于本例中数据比较“干净”,无需做缺失值和异常值处理。

5.向量化

向量化是将读出的数据转换成模型需要的数据格式,根据不同的模型做法不同,本例中的向量化将在后面的模型部分实现。

6.切分训练集和测试集

训练前还需要把数据切分成训练集和测试集,以避免过拟合,本例中将70%的数据用于训练,最终模型将对所有数据预测并做图。

TRAIN_PERCENT = 0.7 train_size = int(len(df) * TRAIN_PERCENT) train = df[:train_size]

拟合直线

拟合程序分成三部分:定义模型、优化器和误差函数;训练模型;预测并做图。

1.定义模型、优化器、误差函数

模型继承自mm.Module,并实现了两个核心函数,init用于初始化模型结构,forward用于定义前向传播的过程。本例中实现了最为简单的模型,其中只包含一个全连接层,使用nn.Linear定义,torch.nn中定义了常用的网络层实现。

class LinearRegression(nn.Module): def __init__(self): super(LinearRegression, self).__init__() self.linear = nn.Linear(1, 1) # 输入和输出的维度都是1 def forward(self, x): x = self.linear(x) return x model = LinearRegression() criterion = nn.MSELoss() # 损失函数:均方误差 optimizer = torch.optim.SGD(model.parameters(), lr=0.001) # 优化算法:随机梯度下降

损失函数使用了均方误差 MSELoss,它计算的是预测值与真值之差平方的期望值,MSELoss也是回归中最常用的损失函数,torch.nn中实现了一些常用的损失函数,可以直接使用,

优化的目标是更好地更新参数,使模型快速收敛。优化算法就是调整模型参数更新的策略,优化器是优化算法的具体实现。本例中优化器optimizer使用了最基础的随机梯度下降optim.SGD优化方法,torch.optim中定义了常用的优化器。在参数中设置了学习率为0.001,并将模型的参数句柄传入优化器,优化器后期将调整这些参数。

注意:学习率是一个重要参数,最好从小到大设置,如果设置太大,可能造成每次对参数修改过大,造成抖动,使得最终无法收敛。

2.训练模型

训练之前,先把数据转换成模型需要的数据格式,将pandas的数据格式转换为float32格式的Tensor张量,然后用unsqueeze扩展维度到2维(unsqueeze已在上一篇详细介绍)。

x = torch.unsqueeze(torch.tensor(np.array(train['x']), dtype=torch.float32), dim=1) y = torch.unsqueeze(torch.tensor(np.array(train['y']), dtype=torch.float32), dim=1) for e in range(10000): inputs = Variable(x) target = Variable(y) out = model(inputs) # 前向传播 loss = criterion(out, target) # 计算误差 optimizer.zero_grad() # 梯度清零 loss.backward() # 后向传播 optimizer.step() # 调整参数 if (e+1) % 1000 == 0: # 每1000次迭代打印一次误差值 print('Epoch:{}, Loss:{:.5f}'.format(e+1, loss.item()))

后面的循环部分进行了10000次迭代,也就是说将所有数据放进模型训练了10000次,从而使模型收敛。每一次循环之中,将x,y分别转换成变量Variable格式。

然后进行前先传播,model(inputs)调用的是nn.Module 的call()函数(call是Python类中的一个特殊方法,如果类中定义了此方法,可以通过实例名加括号的方式调用该方法)父类的call()调用了前向函数forward()将数据传入层中处理。

接下来是误差函数和优化器配合调整模型参数,此处到底修改了哪些值,又是如何修改的,是最难理解的部分。先通过定义的误差函数计算误差,从loss值可以看到每一次迭代之后误差的情况。

下一步是优化器清零,调用优化器的zero_grad方法,清除了model.parameters中的梯度grad。

之后是反向传播,误差函数的backward,调用了torch.autograd.backward()函数,backward()是上面定义的forward()的反向过程,对每层每一个参数求导,并填充在model.parameters的grad中。

最后调用优化器的step方法(step的具体实现可参考torch源码中optim/sgd.py中的step函数),它使用model.parameters中的梯度grad和设置的学习率、动量等参数计算出model.parameters的新data值,形如:weight = weight - learning_rate * gradient。

可以说,最后几步都是针对model.parameters模型参数的修改。整个过程可以通过跟踪model.parameters的data和grad的内容变化来分析。方法如下:

for p in model.parameters(): print(p.data, p.grad)

也可以在程序中加入以下代码,用于跟踪后向传播的过程:

f = loss.grad_fn while True: print(f) if len(f.next_functions) == 0: break f = f.next_functions[0][0]

3.预测和做图

本例中用70%数据作为训练集,用所有数据作为测试集,因此,用全部数据重新计算了x,y值;使用eval函数将模型转换为测试模式(有一些层在训练模型和预测模型时有差别);将数据代入模型预测,并转换成numpy格式作图显示。

x = torch.unsqueeze(torch.tensor(np.array(df['x']), dtype=torch.float32), dim=1) y = torch.unsqueeze(torch.tensor(np.array(df['y']), dtype=torch.float32), dim=1) model.eval() #将模型变为测试模式 predict = model(Variable(x)) # 预测 predict = predict.data.numpy() # 转换成numpy格式 plt.plot(x.numpy(), y.numpy(), 'y') plt.plot(x.numpy(), predict) plt.show()

程序运行结果如下图所示,可以看到模型用一条直线拟合曲线,在前70%的训练数据中表现更好。

多特征拟合

直线拟合的原理是y=kx+b,求斜率k和截距b。其中的x是数据产生的时间,从数据表的索引号转换求得,y是乘客量。还可以使用另一些方法进一步拟合曲线。如:

方法一曲线拟合:从图像数据可以看出,乘客数据走势更拟合一条微微上翘的曲线,设y是x的多项式函数,可使用多项式拟合:y=ax3+bx2+cx+d。

方法二多特征拟合:代入更多条件,比如利用年份、月份作为参数代入

Python beautifulsoup 获取标签中的值 怎么获取?

age = soup.find(attrs={"class":"age"}) #你这里find只要一个attrs参数不会报错。

if age == None: #简单点可以用 if not age:

print u'没有找到'

else:

soup.find(attrs={"class":"name"})

#否则用findAll找出所有具有这个class的tr

tr = html.find("tr", attrs={"class":"show_name"})

tds = tr.findAll("td")

for td in tds:

print td.string # 或许不是string属性,你可以用dir(td)看看有哪些可用的。

扩展资料:

1、如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中。

1)如定义以下函数:

def func(*args):print(args)

当用func(1,2,3)调用函数时,参数args就是元组(1,2,3)

2)如定义以下函数:

def func(**args):print(args)

当用func(a=1,b=2)调用函数时,参数args将会是字典{'a':1,'b':2}

学python的同时一定会接触到其他技术,毕竟光会python这门语言是不够的,要看用它来做什么。比如说用 python做爬虫,就必须接触到html, http等知识。

python是现在最火的数据分析工具语言python的进阶的路线是数据清洗,爬虫,数据容器,之后是卷积,线性分析,和机器学习,区块连,金融方面的量化等高端进阶。

python数据分析与应用第三章代码3-5的数据哪来的

savetxt

import numpy as np

i2 = np.eye(2)

np.savetxt("eye.txt", i2)

3.4 读入CSV文件

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True) #index从0开始

3.6.1 算术平均值

np.mean(c) = np.average(c)

3.6.2 加权平均值

t = np.arange(len(c))

np.average(c, weights=t)

3.8 极值

np.min(c)

np.max(c)

np.ptp(c) 最大值与最小值的差值

3.10 统计分析

np.median(c) 中位数

np.msort(c) 升序排序

np.var(c) 方差

3.12 分析股票收益率

np.diff(c) 可以返回一个由相邻数组元素的差

值构成的数组

returns = np.diff( arr ) / arr[ : -1] #diff返回的数组比收盘价数组少一个元素

np.std(c) 标准差

对数收益率

logreturns = np.diff( np.log(c) ) #应检查输入数组以确保其不含有零和负数

where 可以根据指定的条件返回所有满足条件的数

组元素的索引值。

posretindices = np.where(returns 0)

np.sqrt(1./252.) 平方根,浮点数

3.14 分析日期数据

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), converters={1:datestr2num}, unpack=True)

print "Dates =", dates

def datestr2num(s):

return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday()

# 星期一 0

# 星期二 1

# 星期三 2

# 星期四 3

# 星期五 4

# 星期六 5

# 星期日 6

#output

Dates = [ 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 4. 0. 1. 2. 3. 4. 0.

1. 2. 3. 4.]

averages = np.zeros(5)

for i in range(5):

indices = np.where(dates == i)

prices = np.take(close, indices) #按数组的元素运算,产生一个数组作为输出。

a = [4, 3, 5, 7, 6, 8]

indices = [0, 1, 4]

np.take(a, indices)

array([4, 3, 6])

np.argmax(c) #返回的是数组中最大元素的索引值

np.argmin(c)

3.16 汇总数据

# AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

#得到第一个星期一和最后一个星期五

first_monday = np.ravel(np.where(dates == 0))[0]

last_friday = np.ravel(np.where(dates == 4))[-1]

#创建一个数组,用于存储三周内每一天的索引值

weeks_indices = np.arange(first_monday, last_friday + 1)

#按照每个子数组5个元素,用split函数切分数组

weeks_indices = np.split(weeks_indices, 5)

#output

[array([1, 2, 3, 4, 5]), array([ 6, 7, 8, 9, 10]), array([11,12, 13, 14, 15])]

weeksummary = np.apply_along_axis(summarize, 1, weeks_indices,open, high, low, close)

def summarize(a, o, h, l, c): #open, high, low, close

monday_open = o[a[0]]

week_high = np.max( np.take(h, a) )

week_low = np.min( np.take(l, a) )

friday_close = c[a[-1]]

return("APPL", monday_open, week_high, week_low, friday_close)

np.savetxt("weeksummary.csv", weeksummary, delimiter=",", fmt="%s") #指定了文件名、需要保存的数组名、分隔符(在这个例子中为英文标点逗号)以及存储浮点数的格式。

0818b9ca8b590ca3270a3433284dd417.png

格式字符串以一个百分号开始。接下来是一个可选的标志字符:-表示结果左对齐,0表示左端补0,+表示输出符号(正号+或负号-)。第三部分为可选的输出宽度参数,表示输出的最小位数。第四部分是精度格式符,以”.”开头,后面跟一个表示精度的整数。最后是一个类型指定字符,在例子中指定为字符串类型。

numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)

def my_func(a):

... """Average first and last element of a 1-D array"""

... return (a[0] + a[-1]) * 0.5

b = np.array([[1,2,3], [4,5,6], [7,8,9]])

np.apply_along_axis(my_func, 0, b) #沿着X轴运动,取列切片

array([ 4., 5., 6.])

np.apply_along_axis(my_func, 1, b) #沿着y轴运动,取行切片

array([ 2., 5., 8.])

b = np.array([[8,1,7], [4,3,9], [5,2,6]])

np.apply_along_axis(sorted, 1, b)

array([[1, 7, 8],

[3, 4, 9],

[2, 5, 6]])

3.20 计算简单移动平均线

(1) 使用ones函数创建一个长度为N的元素均初始化为1的数组,然后对整个数组除以N,即可得到权重。如下所示:

N = int(sys.argv[1])

weights = np.ones(N) / N

print "Weights", weights

在N = 5时,输出结果如下:

Weights [ 0.2 0.2 0.2 0.2 0.2] #权重相等

(2) 使用这些权重值,调用convolve函数:

c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)

sma = np.convolve(weights, c)[N-1:-N+1] #卷积是分析数学中一种重要的运算,定义为一个函数与经过翻转和平移的另一个函数的乘积的积分。

t = np.arange(N - 1, len(c)) #作图

plot(t, c[N-1:], lw=1.0)

plot(t, sma, lw=2.0)

show()

3.22 计算指数移动平均线

指数移动平均线(exponential moving average)。指数移动平均线使用的权重是指数衰减的。对历史上的数据点赋予的权重以指数速度减小,但永远不会到达0。

x = np.arange(5)

print "Exp", np.exp(x)

#output

Exp [ 1. 2.71828183 7.3890561 20.08553692 54.59815003]

Linspace 返回一个元素值在指定的范围内均匀分布的数组。

print "Linspace", np.linspace(-1, 0, 5) #起始值、终止值、可选的元素个数

#output

Linspace [-1. -0.75 -0.5 -0.25 0. ]

(1)权重计算

N = int(sys.argv[1])

weights = np.exp(np.linspace(-1. , 0. , N))

(2)权重归一化处理

weights /= weights.sum()

print "Weights", weights

#output

Weights [ 0.11405072 0.14644403 0.18803785 0.24144538 0.31002201]

(3)计算及作图

c = np.loadtxt('data.csv', delimiter=',', usecols=(6,),unpack=True)

ema = np.convolve(weights, c)[N-1:-N+1]

t = np.arange(N - 1, len(c))

plot(t, c[N-1:], lw=1.0)

plot(t, ema, lw=2.0)

show()

3.26 用线性模型预测价格

(x, residuals, rank, s) = np.linalg.lstsq(A, b) #系数向量x、一个残差数组、A的秩以及A的奇异值

print x, residuals, rank, s

#计算下一个预测值

print np.dot(b, x)

3.28 绘制趋势线

x = np.arange(6)

x = x.reshape((2, 3))

x

array([[0, 1, 2], [3, 4, 5]])

np.ones_like(x) #用1填充数组

array([[1, 1, 1], [1, 1, 1]])

类似函数

zeros_like

empty_like

zeros

ones

empty

3.30 数组的修剪和压缩

a = np.arange(5)

print "a =", a

print "Clipped", a.clip(1, 2) #将所有比给定最大值还大的元素全部设为给定的最大值,而所有比给定最小值还小的元素全部设为给定的最小值

#output

a = [0 1 2 3 4]

Clipped [1 1 2 2 2]

a = np.arange(4)

print a

print "Compressed", a.compress(a 2) #返回一个根据给定条件筛选后的数组

#output

[0 1 2 3]

Compressed [3]

b = np.arange(1, 9)

print "b =", b

print "Factorial", b.prod() #输出数组元素阶乘结果

#output

b = [1 2 3 4 5 6 7 8]

Factorial 40320

print "Factorials", b.cumprod()

#output


网站栏目:python线性卷积函数 线性卷积的求法
当前URL:http://hbruida.cn/article/dosjsjo.html