2.1搭建Python開發(fā)平臺
2.1.1所要考慮的問題
Python官網(wǎng):https://www.python.org/
Python是跨平臺的語言,因此腳本可以跨平臺使運行。不同的平臺所運行效率不一樣桑孩, 一般來說倒堕,Linux平臺下會比Windows平臺快
2.1.2基礎(chǔ)平臺的搭建
(1)Windows
直接到官網(wǎng)下載msi安裝包安裝即可
(2)Linux
大多數(shù)Linux發(fā)行版自帶Python2.x版本主程序哪自,因此不需要重新安裝Python程序丰包。
(3)Anaconda
安裝核心程序只是第一步、為了實現(xiàn)更豐富的科學計算功能壤巷,還需要安裝一些第三方的擴展庫邑彪,Anaconda就是其中一個常用的科學計算發(fā)行版。官網(wǎng)地址:https://www.anaconda.com/
Anaconda的特點如下:
- 包含了眾多流行的科學胧华、數(shù)學寄症、工程、數(shù)據(jù)分析的Python包矩动;
- 完全開源免費有巧;
- 額外的加速和優(yōu)化是付費的,但對于學術(shù)用途可申請免費的License悲没;
- 全平臺支持篮迎,Linux、Windows檀训、Mac柑潦;支持Python2.x享言、Python3.x峻凫,可自由切換。
2.2Python使用入門
2.2.1運用方式
(1)賦值
a=2+3 #這句話的意思是將2+3的值賦予給a
(2)如注釋多行可用
'''
這里是多行注釋 這里是多行注釋
'''
2.2.2基本命令
(1)基本運算
a=2 #賦值 a2 #a乘以2 a*2 #a的2次方 a,b,c=1,2,3 #相當于a=1览露,b=2荧琼,c=3 s = 'i like python' #對變量進行賦值(可賦值字符串) s+' very much' #拼接字符串,結(jié)果是i like python very much s.slipt(' ') #對變量以空格分割,結(jié)果為['i', 'like', 'python']
(2)判斷與循環(huán)
1.判斷
if 條件1: 語句2
elif 條件3:
語句4
else :
語句5
2.循環(huán)
while循環(huán):
s,k=0,0
while k<101: #在3.x環(huán)境下此過程為1+2+3+...+101
k=k+1
s=s+k
print(s)
for循環(huán):
s=0
for k in range(101): #在3.x環(huán)境下此過程為1+2+3+...+100
s=s+k
print(s)
3.函數(shù)
def定義函數(shù):
def add2(x):
return x+2
print(add2(1)) #返回結(jié)果為3
Python的函數(shù)可以是多種多樣的命锄,比如返回列表:
def add2(x=0,y=0):
return [x+2,y+3]
def add3(x,y):
return x+3,y+3
a,b=add3(1,2) #a=4,b=5
還支持lambda對簡單的功能定義“行內(nèi)函數(shù)”堰乔,有點像MATLAB里面的“匿名函數(shù)”,如下:
f = lambda x: x+2 #定義函數(shù)f(x)=x+2
g = lambda x,y = x+y #定義函數(shù)g(x,y)=x+y
(3)數(shù)據(jù)結(jié)構(gòu)
Python有4個內(nèi)建的數(shù)據(jù)結(jié)構(gòu)——list(列表)脐恩、tuple(元組)镐侯、dictionary(字典)、set(集合)驶冒,它們可以統(tǒng)稱為容器苟翻。
1.列表/元組
列表和元組都是序列結(jié)構(gòu),很相似骗污,但是又有不同的地方崇猫;列表a=[1,2,3],元組a=(1,2,3)需忿,用法和功能完全一樣诅炉。
區(qū)別:列表可以被修改,而元組不可以被修改屋厘;與列表有關(guān)的函數(shù)是list涕烧,元組是tuple。
列表與元組相關(guān)函數(shù):
- cmp(a,b):比較汗洒;兩個列表/元組的元素
- len(a):列表/元組元素個數(shù)
- max(a):返回列表/元組元素最大值
- min(a):返回列表/元組元素最小值
- sum(a):將列表/元組元素求和
- sorted(a):對列表的元素進行升序排列
列表的方法:
- a.append(1):將1添加到a列表的末尾
- a.count(1):統(tǒng)計列表a中1出現(xiàn)的次數(shù)
- a.extend([1,2]):將列表[1,2]的內(nèi)容追加到列表a的末尾中
- a.index(1):從列表a中找出第一個1的索引位置
- a.insert(2,1):將1插入列表a的索引為2的位置
- a.pop(1):移除列表a中索引為1的元素
列表解析——能夠簡化我們隊列表元素注意進行操作的代碼:
a = [1,2,3]
b=[]
for i in a:
b.append(i+2)
print(b) #列表b=[3, 4, 5]
可簡化為:
a=[1,2,3]
b=[i=2 for i in a]
print(b) #列表b=[3, 4, 5]
2.字典
通俗來講澈魄,它也是一個列表,但是它的“下標”不再是以“0”開頭的數(shù)字仲翎,而是讓自己定義的“鍵”(key)開始痹扇。
創(chuàng)建一個字典的基本方法為:
d={'today':20,'tomorrow':30} #today/tomorrow就是字典的鍵,20/30則是鍵對應(yīng)的值 d['today'] #該值為20 d['tomorrow'] #該值為30
通過dict()函數(shù)轉(zhuǎn)換溯香,或者通過dict.fromkeys來創(chuàng)建:
dict([['today',20],['tomorrow',30]]) #也相當于{'today':20,'tomorrow':30}
dict.fromkeys(['today','tomorrow'],20) #相當于{'today':20,'tomorrow':20}
3.集合
和數(shù)學概念上的集合基本上是一致的鲫构。它與列表的區(qū)別:
a.在于它的元素的不重合的,而且是無序的玫坛;
b.它不支持索引结笨。
一般我們用大括號{}或者set()來創(chuàng)建集合。
s={1,2,2,3} #2會自動去重湿镀,得到{1,2,3} s=set([1,2,2,3]) #同樣會將列表轉(zhuǎn)換為集合炕吸,得到{1,2,3}
集合的運算:
a = t | s #并集
b = t & s #交集
c = t - s #差集(項在t中,但不在s中)
d = t ^ s #對稱差集(項在t或s中勉痴,但不會同時出現(xiàn)在二者中)
4.函數(shù)式編程
函數(shù)式編程主要由幾個函數(shù)構(gòu)成:lambda()赫模、map()、reduce()蒸矛、filter()
a瀑罗、lambda():主要用來定義“行內(nèi)函數(shù)”
b胸嘴、map():類似于列表解析,例如:列表解析可以這樣寫 b =[i+2 for i in a]斩祭,但是利用map函數(shù)我們可以這么寫:
a=[1,2,3]
b =map(lambda x: x+2,a)
b=list(b)
print(b) #結(jié)果是[3,4,5]
注:在3.x需要b = list(b)這一步劣像,在2.x就不需要。是因為在3.x中map函數(shù)進進是創(chuàng)建一個待運行的命令容器摧玫,只有其他函數(shù)調(diào)用它的時候才會返回結(jié)果耳奕。
map()也接受多參數(shù)的函數(shù),如map(lambda x,y:x*y,a,b) 表示將a诬像、b兩個列表的元素對應(yīng)相乘吮铭,把結(jié)果返回給新列表。map()命令和for循環(huán)的對比:列表解析本身還是for命令颅停,在Python中for命令的執(zhí)行效率不高谓晌,而map函數(shù)實現(xiàn)了相同的功能,而效率更高
c癞揉、reduce()函數(shù):與map函數(shù)類似纸肉,map()用于逐一遍歷,reduce()函數(shù)用于遞歸計算喊熟。例如:
reduce(lambda x,y : x*y,range(1,n+1)) #可以計算n的階乘
注:在2.x中柏肪,上述命令可以直接運行,在3.x中芥牌,reduce函數(shù)已經(jīng)被移除了全局命名空間烦味,置于fuctools庫中,可通過from fuctools import reduce引入reduce壁拉。
上述代碼也可用循環(huán)語句寫成:
s=1
for i in range(1,n+1):
s=s*i
d谬俄、filter()函數(shù):它是一個過濾器,用于篩選列表中符合條件的元素弃理。例如:
b=filter(lambda x : x>5 and x<8,range(10))
b=list(b)
print(b) #結(jié)果為[6, 7]
上述語句也可以用列表解析寫出:
b=[i for i in range(10) if i>5 and i<8]
我們使用map()溃论、reduce()、filter()最終的目的是兼顧簡潔和效率痘昌,因為map()钥勋、reduce()、filter()的循環(huán)速度比Python內(nèi)置的while和for循環(huán)快的多辆苔。
(4)庫的導入和添加
1.庫的導入:例如:導入math庫
import math
math.sin(1) #計算正弦
math.exp(1) #計算指數(shù)
math.pi #內(nèi)置的圓周率常數(shù)
重命名庫:
import math as m
m.sin(1)
指定導入某個函數(shù):
from math import exp as e
e(1) help('modules') #獲得已安裝的所有模塊名
2.導入futurn特征
使用2.x的用戶可以通過引入futurn特征的方式兼容代碼算灸,如:
#將print變成函數(shù)形式,即用print(a)的方式輸出:
from __futurn__ import print_function
#3.x的3/2=1.5,3//2=1驻啤;2.x的3/2=1
from __futurn__ import division
3.添加第三方庫
以安裝pandas為例:
打開cmd菲驴,輸入 pip install pandas,點擊回車即可
2.3 Python數(shù)據(jù)分析工具
Python數(shù)據(jù)挖掘相關(guān)擴展庫
numpy:提供數(shù)組支持街佑,以及相應(yīng)的高效的處理函數(shù)
sicpy:提供矩陣支持谢翎,以及矩陣相關(guān)的數(shù)值計算模塊
matplotlib:強大的數(shù)據(jù)可視化工具、作圖庫
pandas:強大沐旨、靈活的數(shù)據(jù)分析和探索工具
statsmodels:統(tǒng)計建模和計量經(jīng)濟學森逮,包括描述統(tǒng)計、統(tǒng)計模型估計和推斷
scikit-learn:支持回歸磁携、分類褒侧、聚類等的強大的機器學習庫
keras:深度學習庫,用于建立神經(jīng)網(wǎng)絡(luò)以及深度學習模型
gensim:用來做文本主題模型的庫谊迄,文本挖掘可以用到
2.3.1 numpy
Python并沒有提供真正的數(shù)組功能闷供,而numpy則提供了真正的數(shù)組功能,它還是很多更高級庫的依賴庫统诺,歪脏,例如scipy、matplotlib粮呢、pandas等婿失。numpy內(nèi)置函數(shù)的處理速度是C語言級別的,因此在編寫函數(shù)的時候應(yīng)當盡量的使用它們內(nèi)置的函數(shù)啄寡,避免出現(xiàn)效率瓶頸的問題(尤其是涉及循環(huán)問題)豪硅。
安裝numpy:
pip install numpy #在Windows中可以像安裝其他第三方庫一樣用pip完成 python setup.py install #Windows還可自行下載源代碼,然后用此代碼安裝 sudo apt-get install python-numpy #在Linux的Ubuntu下安裝
numpy的基本操作:
#-*- coding :utf-8 -*
import numpy as np #一般用np作為numpy的別名
a = np.array([2,0,1,5]) #創(chuàng)建數(shù)組
print(a) #打印結(jié)果
print(a[:3]) #引用前3個數(shù)字(切片)
print(a.min()) #輸出a的最小值
a.sort() #將a的元素從小到大排列挺物,此操作直接修改a懒浮,print(a)為[0,1,2,5]
print(a)
b = np.array([[1,2,3],[4,5,6]]) #創(chuàng)建二維數(shù)組
print(b*b) #輸出數(shù)組的平方陣[[1,4,9],[16,25,36]]
numpy官網(wǎng):http://www.numpy.org/或者http://reverland.org/python/2012/08/12/numpy/
2.3.2 SciPy
SciPy包含的功能有最優(yōu)化、線性代數(shù)识藤、幾份砚著、插值、擬合痴昧、特殊函數(shù)赖草、快速傅里葉變換、信號處理和圖像處理剪个、常微分方程求解和其他科學與工程中常用的計算坑资。SciPy依賴于numpy,因此安裝它之前需要先安裝numpy梢灭,安裝scipy和安裝numpy在Windows平臺上是一樣的悔橄,直接用pip進行安裝即可,sudo apt-get install python-scipy 在Linux的Ubuntu下安裝侵歇。
SciPy求解非線性方程組和數(shù)值積分:
#-*-coding:utf-8 -*
#求解非線性方程組2x1-x2^2=1骂澄,x1^2-x2=2
from scipy.optimize import fsolve #導入求解方程組的函數(shù)
def f(x): #定義要求解的方程組
x1=x[0]
x2=x[1]
return [2*x1-x2**2-1,x1**2-x2-2]
result = fsolve(f,[1,1]) #輸出初值[1,1]并求解
print(result) #數(shù)值積分
from scipy import integrate #導入積分函數(shù)
def g(x): #定義被積函數(shù)
return (1-x**2)**0.5
pi_2,err = integrate.quad(g,-1,1) #積分結(jié)果和誤差
print(pi_2*2) #有微積分知識知道積分結(jié)果為圓周率pi的一半
2.3.3 Matplotlib
主要用于繪制二維圖,也可以進行簡單的三維繪圖惕虑。安裝方法也和上述兩個庫的安裝方法一致坟冲。
注:matplotlib對上級庫的依賴較多磨镶,手動安裝的時候需要吧這些庫也逐一安裝完成
matplotlib繪圖的基本代碼:
#-*-coding:utf-8 -*
import numpy as np
import matplotlib.pyplot as plt #導入matplotlib
x = np.linspace(0,10,1000) #作圖的變量自變量
y = np.sin(x)+1 #因變量y
z = np.cos(x**2)+1 #因變量z
plt.figure(figsize=(8,4)) #設(shè)置圖像大小
plt.plot(x,y,label= '$\sin x+1$',color='red',linewidth=2) #作圖,設(shè)置標簽健提,線條顏色琳猫,線條大小
plt.plot(x,z,'b--',label='$\cos x^2+1$') #作圖,設(shè)置標簽私痹,線條類型
plt.xlabel('Time(s)') #X軸名稱
plt.ylabel('Volt') #Y軸名稱
plt.title('A Simple Example') #標題
plt.ylim(0,2.2) #顯示Y軸范圍
plt.legend() #顯示圖例
plt.show()
做出來的圖如下:
如果使用的是中文標簽脐嫂,會發(fā)現(xiàn)中文標簽無法正常顯示。這是由于matplotlib的默認字體是英文導致的紊遵,解決辦法是在作圖之前手動將默認字體設(shè)置為中文字體账千,如黑體(SimHei):
plt.rcParams['font.sans-serif']=['SimHei'] #這句用來正常顯示中文字體
如果保存圖像負號不顯示則可以用以下代碼解決:
plt.rcParams['axes.unicode_minus']=False #解決保存圖像是負號“-”顯示為方塊的問題
建議:有空多去matplotlib提供的“畫廊”欣賞他做出來的漂亮效果,鏈接如下:https://matplotlib.org/gallery.html
2.3.4 pandas
pandas是Python下最強大的數(shù)據(jù)分析和探索工具暗膜,pandas構(gòu)建在numpy之上匀奏,使得以numpy為中心的應(yīng)用很容易使用。pandas的功能非常強大学搜,支持類似于SQL的增刪改查攒射,并帶有豐富的數(shù)據(jù)處理函數(shù)。支持時間序列分析功能恒水;支持靈活處理缺失數(shù)據(jù)等会放。
(1)安裝
安裝方法和以上的庫均一樣,但是在使用pandas之前需要先安裝numpy才能使用钉凌。pandas本身是不支持Excel文件的讀寫的咧最,需要安裝xlrd(讀)和xlwt(寫)庫才能支持Excel的讀寫。
(2)使用
pandas基本的數(shù)據(jù)結(jié)構(gòu)是Series和DataFrame御雕,Series是序列類似一堆數(shù)組矢沿;DataFrame則是相當于一張二維的表格,類似于二維數(shù)組酸纲,它的每一列就是一個Series捣鲸。為了定位Series中的元素,pandas提供了Index對象闽坡,每個Series都會帶有一個對應(yīng)的Index栽惶,用來標記不同的元素。Index類似于SQL中的主鍵DataFrame相當于對個帶有Index的Series的組合(本質(zhì)是Series的容器)疾嗅,每一個Series都帶有唯一的表頭外厂,用來標識不同的Series。
pandas的簡單例子:
#-*-coding:utf-8 -*
import pandas as pd #通常用pd作為pandas的別名
s = pd.Series([1,2,3],index = ['a','b','c']) #創(chuàng)建一個序列s
d = pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c']) #創(chuàng)建一個表
d2 = pd.DataFrame(s) # 也可以用已有的序列來創(chuàng)建表格
print(d.head()) #預(yù)覽前5行數(shù)據(jù),3.x版本需要加上print
print(d.describe()) #數(shù)據(jù)的基本統(tǒng)計量,3.x版本需要加上print
#讀取文件代承,注意文件的路徑不能有中文汁蝶,否則讀取可能出錯
pd.read_excel('data.xls') #讀取Excel文件,創(chuàng)建DataFrame
pd.read_csv('data.csv',encoding='utf-8') #讀取文本格式的數(shù)據(jù)论悴,一般用encoding指定編碼
2.3.5 StatsModels
相比于pandas而言掖棉,StatsModels更加注重數(shù)據(jù)的統(tǒng)計建模分析墓律,使得Python有了一絲R語言的味道。StatsModels支持與pandas進行數(shù)據(jù)交互幔亥,與pandas進行組合耻讽,成為了Python下強大的數(shù)據(jù)挖掘組合。StatsModels依賴于pandas紫谷,也依賴于pandas所依賴的齐饮,同時還依賴于pasty(一個描述統(tǒng)計的庫)捐寥。
使用StatsModels來進行ADF平穩(wěn)性檢驗的例子:
#-*-coding:utf-8 -*
from statsmodels.tsa.stattools import adfuller as ADF #導入ADF檢驗
import numpy as np
print(ADF(np.random.rand(100))) #返回的結(jié)果是ADF值笤昨、p值等
2.3.6 Scikit-Learn
Scikit-Learn是Python下的一個強大的機器學習包,提供了完善的機器學習工具箱握恳,包括數(shù)據(jù)預(yù)處理瞒窒、分類、回歸乡洼、聚類崇裁、預(yù)測、和模型分析等束昵。Scikit-Learn依賴于numpy拔稳、SciPy、matplotlib锹雏,因此只要提前安裝好這幾個庫然后按照Scikit-Learn基本上沒有什么問題巴比,安裝方法和之前一樣。
使用Scikit-Learn創(chuàng)建一個機器學習的模型:
#-*-coding:utf-8 -*
from sklearn.linear_model import LinearRegression #導入線性回歸模型
model=LinearRegression() #建立線性回歸模型
print(model)
(1)所有模型提供的接口有:
- model.fit():訓練模型礁遵,對于監(jiān)督模型來說是fit(X,y)轻绞,對于非監(jiān)督模型是fit(X)。
(2)監(jiān)督模型提供的接口有:
- model.predict(X_new):預(yù)測新樣本
- model.predict_proda(X_new):預(yù)測概率佣耐,僅對某些模型有用(比如LR)
- model.score():得分越高政勃,fit越好
(3)非監(jiān)督模型提供的接口有:
- model.transfrom():從數(shù)據(jù)中學習新的“基空間”
- model.fit_transfrom():從數(shù)據(jù)中學習到新的基并將這個數(shù)據(jù)按照這組“基”進行轉(zhuǎn)換。
Scikit-Learn本身提供了一些實例數(shù)據(jù)兼砖,比如常見的有安德森鳶尾花卉數(shù)據(jù)集奸远、手寫圖像數(shù)據(jù)集等。
#-*-coding:utf-8 -*
from sklearn import datasets #導入數(shù)據(jù)集
iris=datasets.load_iris() #加載數(shù)據(jù)集
print(iris.data.shape) #查看數(shù)據(jù)集大小
from sklearn import svm #導入SVM模型
clf = svm.LinearSVC() #建立線性SVM分類器
clf.fit(iris.data,iris.target) #用數(shù)據(jù)訓練模型
clf.predict([[5.0,3.6,1.3,0.25]]) #訓練好模型后讽挟,輸入新的數(shù)據(jù)進行預(yù)測
print(clf.coef_) #查看訓練好的模型的參數(shù)
2.3.7 Keras
本書用Keras來搭建神經(jīng)網(wǎng)絡(luò)然走,但是Keras并不只是神經(jīng)網(wǎng)絡(luò)庫,而是一個基于Theano的強大的深度學習庫戏挡,還可以利用它搭建自編碼器芍瑞、循環(huán)神經(jīng)網(wǎng)絡(luò)、遞歸神經(jīng)網(wǎng)絡(luò)褐墅、卷積神經(jīng)網(wǎng)絡(luò)等拆檬,由于基于Theano洪己,因此速度也很快。Keras大大的簡化了搭建神經(jīng)網(wǎng)絡(luò)的難度竟贯,允許普通用戶輕松地搭建并求解具有幾百個輸入節(jié)點的深層神經(jīng)網(wǎng)絡(luò)答捕,而且定制的自由度非常大。
(1)安裝
安裝Keras之前需要安裝numpy屑那、SciPy和Theano拱镐,安裝Theano需要先準備一個C++編譯器,這在Linux下是自帶的持际,所以在Linux上安裝是相對簡單一些的沃琅,而在Windows上則需要先安裝MinGW(Windows下的GCC和C++),然后再安裝Theano蜘欲,最后安裝Keras益眉。如果需要實現(xiàn)GPU加速則需要安裝和配置CUDA。值得一提的是在windows下Keras會大打折扣姥份,因此想要在神經(jīng)網(wǎng)絡(luò)和深度學習方面進行深入研究郭脂,請在Linux下搭建相應(yīng)的環(huán)境。
(2)使用
簡單搭建一個MLP(多層感知器)澈歉,如下:
#-*-coding:utf-8 -*
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD
model = Sequential() #模型初始化
model.add(Dense(20,64)) #添加輸入層20個節(jié)點展鸡,第一隱藏層64個節(jié)點的連接
model.add(Activation('tanh')) #第一隱藏層用tanh作為激活函數(shù)
model.add(Dropout(0.5)) #使用Dropout防止過擬合
model.add(Dense(64,64)) #添加第一隱藏層64節(jié)點,第二隱藏層64節(jié)點連接
model.add(Activation('tanh')) #第二隱藏層用tanh作為激活工具
model.add(Dropout(0.5)) #使用Dropout防止過擬合
model.add(Dense(64,1)) #添加第二隱藏層64節(jié)點埃难,輸出層1節(jié)點連接
model.add(Activation('sigmoid')) #輸出層用sigmoid作為激活函數(shù)
sgd = SGD(lr=0.1,decay=le-6,momentum=0.9,nesterov=True) #定義求解算法
model.compile(loss='mean_squared_error',optimizer=sgd) #編譯生成模型莹弊,損失函數(shù)為平均誤差平方和
model.fit(x_train,x_train,nb_epoch=20,batch_size=16) #訓練模型
score = model.evaluate(x_test,y_test,batch_size=16) #測試模型
注:Keras的預(yù)測函數(shù)和Scikit-Learn有所差別,Keras用model.predict()方法給出概率凯砍,model.predict_classes()方法給出分類結(jié)果箱硕。