1,Python作为一门编程语言开发效率快,运行效率被人诟病,但是Python核心部分使用c/c++等更高效的语言来编写的还有强大的numpy, padnas, matplotlib,scipy库等应用,在一定程度上解决了Python的运行效率问题
2,搭建Python开发平台
- .5555666600Python的科学计算发行版---Anaconda
- Anaconda的特点如下:
- 包含了众多流行的科学、数学、工程 、数据分析的Python包
- 完全开源免费
- 额外的加速、优化是收费的,但对于学术用途可以申请免费的License
- 全平台支持:Linux、Windows、Mac,支持Python2和Python3
3,Python效率的问题(回顾)
- 我们要将会从哪个使用map()、reduce()、filter()Python的内置函数,目的是兼顾简洁和效率,内置函数的效率相当于c语言,要比Python内置的for循环和while循环快得多,因此下面的内容会大量使用Python的 内置函数
4,库的导入与添加(回顾)
import cmath
a = cmath.sin(1) # 计算正弦
b = cmath.exp(1) # 计算指数
c = cmath.pi # 内置的圆周率常数
print(a) # (0.8414709848078965+0j)
print(b) # (2.718281828459045+0j)
print(c) # 3.141592653589793
print(3/2, type(3/2)) # 1.5 <class 'float'>
print(1.2-0.2,type(1.2-0.2)) # 1.0 <class 'float'>
5,python数据分析工具
扩展库 | 简介 |
Numpy | 提供数组支持,以及相应的高效的处理函数 |
Scipy | 提供矩阵支持以及矩阵相关的数值计算模块 |
Matplotlib | 强大的数据可视化工具、做图库 |
Pandas | 强大、灵活的数据分析和探索工具 |
StatsModels | 统计建模和计量经济学,包括描述统计统计模型估计和推断 |
Scikit-Learn | 支持回归,分类聚类等强大的及机器学习库 |
Keras | 深度学习库,用于建立神经网络以及深度学习模型 |
Gensim | 用来做文本主题模型的库,文本挖掘可能用到 |
- 5.1Numpy:
- 提供真正数组的功能,以及对数据进行快速处理的函数。
- 下载安装:pip install numpy
import numpy as np
a = np.array([2, 0, 1, 9]) print(a) print(a[:3]) # 切片 print(a.min()) # 计算列表的最小值,min(self, iterable) a.sort() # 调用列表的排序方法 b = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维数组 print(b * b) """ [ [1,2,3], [4,5,6] ] 相乘 [ [1,2,3], [4,5,6] ] [ [1,4,9],------>[1*1, 2*2, 3*3] [16,25,36]----->[4*4,5*5,6*6] ] 数组是一致的数组 """
- 5.2Scipy:
- scippy提供真正的矩阵,以及大量基于矩阵运算的对象与函数
- scipy包含的函数功能有最优化、线性代数、积分、差值、拟合、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学和工程中常用的计算,显然这些都是数据挖掘和与建模必备的
- Scipy依赖于Numpy,因此安装 它之前先安装Numpy,和Numpy的安装方式一样。
# 求解非线性方程组2x1-x2^2=1,x1^2-x2 = 2
from scipy.optimize import fsolve
def func(x):# 定义要求解的方程组
x1 = x[0] x2 = x[1] return [2*x1 - x2**2 -1, x1**2 -x2 -2] result = fsolve(func,[1, 1]) # 输入初始值1,1并求解 print(result) # 输出结果[1.91963957 1.68501606] # 数值积分 from scipy import integrate def g(x): # 定义被积函数 return (1-x**2)**0.5 pi_2, err = integrate.quad(g, -1, 1) # 积分结果和误差 print(pi_2*2) # 有微积分知识知道积分结果为uan周吕PI的一半 # 3.1415926535897967
- 5.3Matplotlib:
- 不论是数据挖掘还是数据建模,都免不了数据可视化的问题,Matplotlib不仅可以绘制二维图,也可以绘制就一些三维图
import numpy as np
import matplotlib.pyplot as plt # 导入matplotlib
x = np.linspace(0, 10, 1000) # 作图的变量自变量
y = np.sin(x) # 因变量y
z = np.cos(x*2) # 因变量z
plt.figure(figsize=(8, 4)) # 设置图像大小 plt.plot(x, y, label='$\sin x+1$', color='red', linewidth=2) # 作图,设置标签、线条颜色、线条大小 plt.plot(x, z, 'b--', label='$\cos x^2+1$') # 作图,设置标签、线条类型 plt.xlabel('Time(s)') # x轴名称 plt.ylabel('Volt') # y轴名称 plt.title('A Simple Example') # 标题 plt.ylim(0, 2.2) # 显示y轴范围 plt.legend() # 显示图例 plt.show() # 显示作图结果
-
- 如果是中文标签,就会发现中文标签无法正常显示,解决办法作图之前手动将默认字体修改掉
- pltrcParams['font.sans-serif'] = ['SimHei'] # 这俩句用来显示正常中文标签
- 在作图的时候负号可能显示不正常,可以通过以下代码实现:
- plt.rcParams['axes.unicode_minus'] = False # 解决保存图像,负号为方块的问题
- 参考链接:
- 如果是中文标签,就会发现中文标签无法正常显示,解决办法作图之前手动将默认字体修改掉
- 5.4pandas:
- Pandas是Python最强大的数据库分析和探索工具,它包含高级的数据结构和精巧的工具,使得在Python中处理数据非常快和简单
- Pandas基本的数据结构是Series。Series是序列类似于一堆数组;DateFrame相当于一张二维的表格,它的每一列都是一个Series,为了定位Series中的元素,Pandas提供了index对象,每个Series都会带一个对应的Index用来标记不同的元素,Index不一定是数字,也可以是字母,中文等,它 类似于SQL中的主键
import pandas as pd
s = pd.Series([1, 2, 3], index=["a", "b", "c"]) # 创建一个序列s
d = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "b", "c"]) # 创建一个二维列表
d2 = pd.DataFrame(s) # 也可以用已经有的序列来创建表格
d.head() # 预览前5行数据
d.describe() # 数据基本统计量
# 读取文件,注意文件的存储路径不能带有中文,否则读取可能会出错
pd.read_excel("data.xls") # 读取excel文件,创建DataFraame
pd.read_csv("data.csv", encoding="utf-8") # 读取文本格式的数据,一般用encoding指定编码
-
- 后边还会详细的用pandas,这里就不在赘述了
- 参考链接:
- 5.5StatsModels:
- StatsModels注重数据的同级分析建模,它是的Python有了R语言的味道StatsModels支持与pandas进行数据交互,一它与pandas结合,成为Python强大的数据挖掘组合
- 通过pip安装就好了
from statsmodels.tsa.stattools import adfuller as ADF # 导入ADF检验
import numpy as np
print(ADF(np.random.rand(100))) # 返回的结果有ADF值, p值等
"""
(-7.516108057146661, 3.899499612937967e-11, 2, 97, {'1%': -3.4996365338407074, '10%': -2.5829283377617176, '5%': -2.8918307730370025}, 33.01000991650656)
"""
- 5.6Scikit-Learn
- 这是一个机器学习相关的的包,它提供了完善的机器学习工具箱,也包括数据预处理、分类、回归、聚类、预测和模型分析等
- Sciklit-Learn依赖于numpy、scipy、和matpltlib,安装直接pip install Scikit-Learn就好了
from sklearn.linear_model import LinearRegression # 导入线性回归模型 model = LinearRegression() # 建立线性回归模型 print(model) # LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,normalize=False)
-
- 所有模型提供的接口有:
- model.fit():训练模型,对于监督模型来说是fit(X, y),对于非监督模型是fit(X)。
- 监督模型提供的接口有:
- model.predict(X_new):预测新样本
- model.predict_probal(X_new):预测概率 ,仅对某些模型有用(比如LR)
- model.score():得分越高,fit越好
- 非监督模型提供的接口有:
- model.transform():从数据中学到新的"基空间"
- model.fit_transform():从数据中学到新的基并将 这个数据按照这组"基"进行交换。
- 所有模型提供的接口有:
from sklearn import svm # 导入svm模型 clf = svm.LinearSVC() # 建立线性SVM分类器 clf.fit(iris.data, iris.target) # 用数据训练模型 clf.predict([[5.0, 3.6, 1.3, 0.25]]) # 训练好模型之后,输入新的值进行预测 clf.coef_ # 查看训练好模型的参数 # 报了一个 错,让我增加迭代次数
-
- 参考链接:
- 5.7Keras
- 虽然scikit-Learn足够强大,但是它并没有包含一种强大的模型-人工神经网络。人工神经网络功能是相当强大的,但是原理相对简单,在语言处理、图像识别等领域有着重要的作用
- Keras是基于Theano的模块的,它是定义、优化和高效地解决多维数组数据对应数学表达式的模拟估计问题。它有效地实现符号分解、高度优化的速度和稳定性等特点,最重要的是它还实现了CPU加速,使得密集数据的处理速度是CPU的数十倍
- 安装Keras之前首先要安装Numpy、Scipy、Theano。安装Theano先准备一下c++编译器(MinGW),再下载Numpy等依赖包,再下载Keras,如果想要实现CPU加速,还需要安装和配置CUDA(在windows下速度运行的会打折扣,建议在Linux下安装和配置)
- 参考链接
- 用Keras搭建一个简单的MLP(多层感知器)
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节点)、第一隐藏层(64节点的连接) model.add(Activation('tanh')) model.add(Dropout(0.5)) # 使用Droout防止过拟合 model.add(Activation("tanh")) # 第二隐藏层用tanh作为激活函数 model.add(Dense(64, 1)) # 添加第二隐藏层(64节点)、输出层(1节点的连接) model.add(Activation("sigmod")) # 输出用sigmod 作为激活函数 sgd = SGD(lr=0.1, decay=1e-6, monmenton=0.9, nesterov=True) # 定义求解算法 model.compile(loss="mean_squared_error", optimizer=True) # 编译生成模型,损失函数为平均误差平方和 model.fit(X_train, Y_train, nb_epoch=20, batch_size=16) # 训练模型 score = model.evaluate(X_test, y_test, batch_size=16) # 测试模型
-
- 要注意的是,Keras的预测函数与Scikit-Learn有所差别,Keras用model.predict()给出概率,model.predict_classes()方法给出和分类结果
- 参考链接:
- http://radmrehurek.com/gensim/
- http://www.52nlp.cn/如何计算两个文档的相似度二
- 5.8Gensim
- 在Gensim的官网中,对自己的介绍只有一句话:topic modelling for humans!
- Gensim是用来处理语言方面 的任务,如文本想的相似度计算、LDA、Word2Vec
- 在Gensim的官网中,对自己的介绍只有一句话:topic modelling for humans!
import gensim, logging
logging.basicConfig(format="%(asctime)s : $(levelname)s : %(message)s", level=logging.Info) # logging是用来输出训练日志 # 分好词的句子, 每个句子以词列表的形式输入 sentences = [["first", "sentence"], ["second", "sentence"]] # 用以上句子训练词向量模型 model = gensim.model.Word2Vec(sentences, min_count=1) print(model["sentence"]) # 输出单词sentence的词向量