Python教程:第3章 从数据处理到数据科学 3.1-3.3

在学习完基本的一些内容后,我们可以开始接触数据了.
在日常生活中,我们的一举一动都可以是一个数据.那么,我们就先需要一个载体来存储它们.
于是,计算机应运而生.一开始,人们只能用二进制、十六进制等来存储数据,不仅不方便,速度还慢.后来,我们有了txt(text,纯文本数据存储),csv(comma seperated values,逗号分割数据),xlsx表格等等一系列数据存储工具.为了集中化管理数据,又出现了了SQL(对象型数据库),例如MySQL(单射数据库)NoSQL(双射数据库)等.
本章我们将讲解的内容是:

  • MySQL的安装和使用
  • 用Python调用MySQL
  • numpy和pandas的进一步使用
  • 权重算法和回溯算法
  • 线性回归计算
  • 非线性数据回归处理
  • 第三方库sklearn的基本操作
  • 多组数据回归到单目标组
  • 完美的机器学习: scikit-learn的使用
  • SQL数据查找优化
  • 自然语言的基本逻辑
  • 简单的英语句子处理
  • 用第三方库jieba处理中文段落

3.1. MySQL的安装和使用

3.1.1.安装并启用MySQL

正好最近我换了新电脑,重新弄了下SQL.讲的可能不是很到位,还请见谅.
注意,因为事项很多,可能需要不断取消重来.这是正常状况.
第一步 去官网下载SQL下载: 点击一键下载.
第二步 解压得到msi文件,双击运行.
第三步 一路按next或者Yes(有警告也是Yes).
第四步 在Choosing a setup Type页面选择Full(大概率没有! 如果没有就cancel取消本次安装然后重新运行)
第五步 在Check Requirements页面应当显示十个左右(一般8个以上就没事)的组件,如果较少也是取消重来.
第六步 在Installation页面的组件数和第五步相同.如果不同,取消重来.
第七步 一直下一步.直到出现Type and Networking页面.如果没出现这一步就结束了安装,接着取消重来.
第八步 在Type and Networking页面的Config Type选择Development Computer ; Connectivity选择TCP/IP,自行输入端口(默认3306就行).
第九步 继续一路Next.到Accounts and Roles页面.没有的话还是取消重来.这里输入你想要的密码(任意均可).
第十步 在Windows Service界面输入服务名称(自选,默认MySQL80).
第十一步 在Apply Configuration界面按Execute,等待安装.后面一直Next即可,直到安装程序有Finish按键.
第十二步 如果你没有更改路径,那么去到C:\Program Files\MySQL\MySQL Server 8.0文件夹,添加my.ini(如果没有权限,先在别的地方按照下面的步骤配置好再把文件复制回来).
第十三步 在系统环境变量中添加C:\Program Files\MySQL\MySQL Server 8.0\bin.
第十四步 在my.ini中添加如下内容:

[mysqld]
datadir=C:\Program Files\MySQL\MySQL Server 8.0\data
basedir=C:\Program Files\MySQL\MySQL Server 8.0

第十五步 在cmd终端用net start mysql80 , 如果启动成功就说明安装成功.
第十六步 输入mysql.exe -u root -p,如果出现Enter password:就说明exe安装成功.此时输入密码即可进入mysql内部.

3.1.2.MySQL基础语法

3.1.2.1.MySQL的数据结构

在MySQL中,所有是数据被存在数据表(table)中,而数据表存在数据库(database)中.你可以把每一个数据表想象为一个表格,而数据库就是装着表格的文件夹.我们必须先创建文件夹,然后才能在文件夹中创建数据表,最后写入数据.
数据表分为表头和数据两块.每个表头就是一列,例如有数据表如下:

useridnamedescription
1AlexA boy
2JoannaA girl

那么表头(一般用元组表示)就是(userid,name,description),而数据就是((1,"Alex","A boy"),(2,"Joanna","A girl")).这是MySQL独有的表示方法.

3.1.2.2.MySQL中的数据类型

在Python中,我们可以不断更改一个变量的类型,例如

i=114514
i="114514"

在将i定义为一个int后可以再次转为string,但MySQL不可以.每一列的值的类型都必须相同且不可更改.在创建数据表中某列时必须规定它可以存储的数据类型,插入数据时如果类型不对就会报错.
下面是MySQL中的数据类型.(之所以用java做对比,是因为Python对数据类型的概念太模糊)

MySQL中的数据类型括号内参数的意义对应的Java类型
varchar(n)字符串长度string
int(n)整形数长度(例如,n=3则取值范围-8到7)int
boolean(1)或tinyint(1)只能为1boolean
float(n)浮点数精度float或double
NULL无括号None

在表中,每一格的数据都必须是Simple类型的数据,而不能含有多个数据,即不能为array,list,tup等类型.
弄清楚了数据类型,就准备开始创建数据库和数据表了.

3.1.2.3.创建数据库和数据表

首先要创建文件夹嘛,所以我们使用

create database 文件夹(数据库)名称 default charset utf8;

首先,我们一定要加上字符集utf8,否则默认ASCII就不支持中文了;同时还会导致后面Python读取时出现encode解码错误.
然后SQL语言最后一定一定要记得加分号.
接着我们要进入到文件夹下,毕竟我们要设置工作目录嘛.

use 文件夹名称;

这时我们就可以加入数据表了,用:

create table 表名(
	列名1 类型1 (是否可为null) (是否为主键) (是否自加),
	列名2 类型2 (...),
	...
)default charset utf8;	 

有几点要注意:

  • 在表名后左括号前 和 default前最好不要有括号,否则容易出些奇奇怪怪的问题
  • 一定要加charset
  • 在声明列的数据类型后,有三个可选的内容,分别是:
    • nullnot null.默认为not null.这一选项决定了该列值是否可以为空.
    • primary key.主键.一个表最多有一个主键,可以没有.主键中的值不能重复.
    • auto_increment.自加.一般和主键配合使用,用于制作索引等.
  • 最后一列声明时候右括号之前没有逗号
    然后就可以使用数据表了.

3.1.2.4.添加和修改表中数据

在创建好列之后,就准备往里加数据了.例如我们还是前面那张表.想要加入那两行数据,我们要用到这样的语句:

insert into 表名 (列名1,列名2,列名3) values (数据1,数据2,数据3);

直接一对一插入即可.
那如果一不小心写错了个数据咋整?不急,我们还有这个语句:

update 表名 set 列名1=新数据1,列名2=新数据2,列名3=新数据3 where 列名1=原数据1;

在SQL中,想要对指定的行进行操作,要用到where语句.它可以根据列名查找到行数,然后对该行进行前面的set操作.如果想对全部行实行操作,可以直接不加where,或者用where 1=1.
当然我们也可以删除某条数据,使用

delete from 表名 where 列名1=数据1&列名2=数据2;

可以使用&号来表示同时满足.
删除表和数据库可以用

drop table 表名;
drop database 数据库名;

删除数据库必须在根目录下操作,不能在某数据库中.

3.1.2.5.从表中读取数据

在创建并给入数据后,我们肯定还需要读取它们.因此,我们有以下这些语句:

  • 从根目录中查看有哪些数据库
show databases;
  • 查看某数据库汇总有哪些数据表
use 数据库;
show tables;
  • 从表中读取数据
select 列名1,列名2,列名3 from 表名 where 条件

那么MySQL Shell的使用我们就讲到这里.下面我们开始使用Python操作MySQL.

3.2.用Python调用MySQL

在处理大量数据时,手动在Shell中敲insert肯定是不现实的.此时我们就需要Python来辅助我们.先下载必要的包:pip install pymysql.
然后我们创建以下两个变量:

import pymysql as sql
connect = sql.connect(host="127.0.0.1",port=3306,user="root",password="你的密码",charset="utf8")
cursor = connect.cursor()

connect实例用于保持Python和数据库的连接;而cursor负责执行命令.为了操作上表,我们需要进入数据库db1.

cursor.execute("use db1")

在Python中,SQL命令结尾可以不添加分号.
在执行一次操作后,它还是留在了Python的操作流中而没有被实际更新到MySQL中.我们需要让connect来将操作流中的操作更新至数据库.

connect.commit()

然后,我们创建一个表(一般创建表在Shell中执行)

-- 本命令在MySQL Shell中执行
create table tb1(
	userid int(32) not null primary key auto_increment,
	name varchar(16) not null,
	description varchar(114) default "No description"
)default charset utf8;	

然后我们在Python中创建一个类来方便地管理用户数据.

class user():
	def __init__(self,name,desc=None):
		self.name=name
		if desc:
			self.desc=desc
		else:
			self.desc="No description"

	def into_sql(self):
		cursor.execute("insert into tb1 (name,description) values (%s,%s)",args=(self.name,self.desc))
		connect.commit()

def get_desc(name):
	cursor.execute("select userid,description from tb1 where name=%s",(name))
	answer=cursor.fetchall()
	user1=answer[0]
	id_=user1[0]
	description=user1[1]
	return id_,description	

先看into_sql 方法.在创建一个user对象之后将它的两个属性分别写入数据表tb1中,分别对应列namedescription.注意一下,在execute语句中,%s等调用外部数据的表达符号不必要在双引号之后再%(变量...),而是直接写args=(变量...).这有利于MySQL进行类型调整.
然后我们看get_desc方法.指定一个name后从表中按照name=...的要求去查找并返回.注意下MySQL的返回格式:((值,值...),(值,值...),...)即元组套元组的方式.每一个小元组都是属于同一行的,可以为空,即((,),).
是的,你没看错,用pymysql调用MySQL就是这么简单.

3.3.numpy和pandas库的进一步使用

初学者可先跳过本节 难度较大!!
请确保有一定的数学功底再学习本节,否则建议直接去看3.4.

我们都知道,sklearn.datasets提供了相当一部分的基础数据训练库,例如iris等等.本节我们尝试使用它来构建一个学习网络.
不过呢,在此之前,我们需要先回顾一下一些数学知识.
1.主成分分析(Principal Component Analysis, PCA).我们有一个n维空间结果空间 Ω n \Omega_n Ωn,其中含有m个样本点 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm}.如果 m > > n m>>n m>>n,如何将样本集压缩到k维空间使得 k < n k<n k<n且丢失的数据量尽可能小?
我们设新的坐标系为 { w 1 , w 2 , . . . , w n } \{w^1,w^2,...,w^n\} {w1,w2,...,wn}, w i ∈ R n w^i\in R^n wiRn且为标准正交基向量,即
∣ ∣ w i ∣ ∣ 2 = 1    ,    w i T w j = 0 ( i ≠ j ) ||w^i||_2=1\ \ ,\ \ w^{i\mathrm{T}}w^j=0(i\not=j) ∣∣wi2=1  ,  wiTwj=0(i=j)
此时我们有
X ∗ = W Z = W ⋅ W T X \mathbf{X^*=WZ=W·W^\mathrm{T}X} X=WZ=WWTX
而PCA将其转换为求带约束的最优化问题,即:
min ⁡ w ∣ ∣ X − X ∗ ∣ ∣ F 2 = min ⁡ w ∣ ∣ X − W ⋅ W T X ∣ ∣ F 2 \min_w||\mathbf{X-X^*}||^2_\mathrm{F}=\min_w||\mathbf{X-W·W^\mathrm{T}X}||^2_\mathrm{F} minw∣∣XXF2=minw∣∣XWWTXF2.
s . t . W T W = I \mathrm{s.t}. \mathbf{W^{\mathrm{T} }W=I} s.t.WTW=I
化简得
max ⁡ w t r ( W T X X T W ) \max_wtr(\mathbf{W}^{\mathrm{T}}\mathbf{XX}^{\mathrm{T}}\mathbf{W}) maxwtr(WTXXTW)
我们利用拉格朗日乘子法得到
L ( W , λ ) = t r ( W T X X T W ) + λ ( I − W T W ) L(\mathbf{W},\lambda)=\mathrm{tr}(\mathbf{W}^{\mathrm{T}}\mathbf{XX}^{\mathrm{T}}\mathbf{W})+\lambda(\mathbf{I}-\mathbf{W^{\mathrm{T}}W}) L(W,λ)=tr(WTXXTW)+λ(IWTW)
两边求导得
X X T W = λ W \mathbf{XX}^{\mathrm{T}}\mathbf{W}=\lambda W XXTW=λW
很简单吧?然后就能求出W了.接下来我们用Python来实现它.

from sklearn.datasets import load_iris
import numpy as np
from numpy.linalg import eig

def pca(X,k):
	X=X-X.mean(axis=0)
	X_cov=np.cov(X.T,ddof=0)
	egiv,egia=eig(X_cov)
	k_index=egiv.argsort()[-k:][::-1]
	k_eigv=egia[k_index]
	return np.dot(X,k_eigv.T)

iris=load_iris()
X_pca=pca(X=iris.data,k=2)
print(X_pca)	

利用numpy的eig函数就能做到(numpy牛逼~~!!!).
打印结果:

[[ 4.97868859e-01 -1.35075351e+00]
 [ 7.53885926e-01 -9.68768289e-01]
 [ 6.08493838e-01 -1.15768716e+00]
 [ 5.21608086e-01 -9.56636595e-01]
 [ 3.96071322e-01 -1.41531740e+00]
 [ 2.32137811e-01 -1.55274621e+00]
 [ 4.14383159e-01 -1.26744842e+00]
 [ 4.69186091e-01 -1.20949403e+00]
 [ 6.38851507e-01 -8.53490888e-01]
 [ 5.98475344e-01 -9.50021039e-01]
 [ 4.16764097e-01 -1.46235147e+00]
 [ 3.38705788e-01 -1.13279845e+00]
 [ 6.86198547e-01 -9.28343727e-01]
 [ 6.80114207e-01 -1.06545572e+00]
 [ 5.38951057e-01 -1.89458215e+00]
 [ 1.28665373e-01 -2.06276585e+00]
 [ 4.64949751e-01 -1.79191054e+00]
 [ 5.29417578e-01 -1.38272582e+00]
 [ 3.74663946e-01 -1.47311451e+00]
 [ 2.74237961e-01 -1.54198317e+00]
 [ 4.97334758e-01 -1.12372087e+00]
 [ 3.71445558e-01 -1.50093933e+00]
 [ 4.84328626e-01 -1.62067273e+00]
 [ 5.49223815e-01 -1.12126490e+00]
 [ 1.64096833e-01 -9.53425196e-01]
 [ 6.73618615e-01 -8.57638374e-01]
 [ 4.74080545e-01 -1.21364757e+00]
 [ 4.75804533e-01 -1.29941468e+00]
 [ 5.99666395e-01 -1.28618962e+00]
 [ 4.33884883e-01 -9.78313907e-01]
 [ 5.35682419e-01 -9.13750015e-01]
 [ 6.76838167e-01 -1.30724766e+00]
 [ 5.03025506e-02 -1.70553923e+00]
 [ 1.82811355e-01 -1.89567552e+00]
 [ 6.30024064e-01 -9.81993349e-01]
 [ 7.75112801e-01 -1.24283499e+00]
 [ 7.00626480e-01 -1.44435360e+00]
 [ 3.28383944e-01 -1.37489284e+00]
 [ 6.31395615e-01 -9.86298115e-01]
 [ 5.05324751e-01 -1.21794628e+00]
 [ 5.51481904e-01 -1.43406465e+00]
 [ 1.15869513e+00 -5.15609672e-01]
 [ 5.00077861e-01 -1.13233040e+00]
 [ 4.71519106e-01 -1.35060833e+00]
 [ 7.29747402e-02 -1.33479114e+00]
 [ 7.49295986e-01 -9.92288348e-01]
 [ 1.84486257e-01 -1.45021977e+00]
 [ 5.14152194e-01 -1.08944382e+00]
 [ 3.80625438e-01 -1.45389922e+00]
 [ 5.93047954e-01 -1.19626897e+00]
 [-1.60633863e-01  2.97140160e-01]
 [-2.29511129e-01  1.96299192e-01]
 [-2.15970896e-01  4.66218410e-01]
 [ 2.64088320e-01  6.94503952e-01]
 [ 1.10600536e-02  5.39702597e-01]
 [-2.82943673e-01  6.11474146e-01]
 [-4.16165916e-01  2.19345155e-01]
 [ 2.94372226e-01  3.49580667e-01]
 [-8.15576029e-02  5.22178823e-01]
 [-1.72114620e-02  3.36032738e-01]
 [ 4.76740423e-01  7.52775155e-01]
 [-1.04277715e-01  2.05219487e-01]
 [ 4.15794335e-01  8.21175769e-01]
 [-2.88905165e-01  5.92258853e-01]
 [ 1.39085657e-01  8.79050724e-03]
 [-2.87820084e-02  2.16139809e-01]
 [-3.87302648e-01  4.09949490e-01]
 [-4.29803543e-02  5.32790638e-01]
 [ 3.54800324e-01  9.43365130e-01]
 [ 1.64014771e-01  5.44172951e-01]
 [-4.90167222e-01  3.22016767e-01]
 [ 1.52625889e-01  2.78709726e-01]
 [-3.88495887e-02  9.55028780e-01]
 [-2.86343726e-01  7.29219617e-01]
 [ 2.07740341e-02  3.59710077e-01]
 [ 7.38209509e-04  2.97608203e-01]
 [-2.84786584e-02  6.65900320e-01]
 [-2.17694884e-01  5.51985519e-01]
 [-1.77089134e-01  4.49156628e-01]
 [ 3.35757774e-01  2.55512534e-01]
 [ 2.51737974e-01  5.65850263e-01]
 [ 2.78392240e-01  5.38031490e-01]
 [ 1.36523055e-01  3.49263851e-01]
 [-3.63440572e-01  9.21963103e-01]
 [-4.59579966e-01  4.26853993e-01]
 [-4.73834801e-01  5.21036002e-02]
 [-1.71842245e-01  3.63540747e-01]
 [ 3.20385653e-01  8.66050272e-01]
 [-2.17588146e-01  2.34729779e-01]
 [ 1.32770565e-01  5.48471665e-01]
 [-1.97248972e-01  7.46592164e-01]
 [-2.96361057e-01  4.59451626e-01]
 [ 1.43978947e-01  4.82071077e-01]
 [ 3.96169762e-01  4.14144559e-01]
 [-7.88144999e-02  5.13569292e-01]
 [-2.71201191e-01  3.18040921e-01]
 [-1.73993595e-01  3.59084754e-01]
 [-5.15032842e-02  3.76614580e-01]
 [ 5.07148341e-01  4.83144609e-02]
 [-5.01317327e-02  3.72309814e-01]
 [-8.88866249e-01  7.08878441e-01]
 [-3.41071732e-01  8.42950674e-01]
 [-4.70772237e-01  9.28407019e-01]
 [-6.14259835e-01  9.85584856e-01]
 [-5.97852487e-01  8.87357134e-01]
 [-6.97499837e-01  1.30468334e+00]
 [-2.48881438e-01  7.70251347e-01]
 [-6.60294139e-01  1.31959992e+00]
 [-3.23475660e-01  1.36342259e+00]
 [-8.18797933e-01  4.73550831e-01]
 [-3.84846784e-01  3.86731887e-01]
 [-2.40645747e-01  9.11819332e-01]
 [-3.46376274e-01  7.14599441e-01]
 [-1.56140932e-01  9.05671819e-01]
 [-2.48987013e-01  6.10072979e-01]
 [-4.42745256e-01  4.18849373e-01]
 [-5.49438409e-01  8.35873126e-01]
 [-1.21328646e+00  7.39920716e-01]
 [-5.10237186e-01  1.70372429e+00]
 [-8.49192003e-03  1.25922505e+00]
 [-4.94863900e-01  6.15752448e-01]
 [-3.31053238e-01  6.35284557e-01]
 [-6.19795128e-01  1.53402677e+00]
 [-7.55211851e-02  7.13079562e-01]
 [-6.95897534e-01  6.23585428e-01]
 [-7.18800475e-01  9.29630495e-01]
 [-1.19115736e-01  5.88724587e-01]
 [-3.44775135e-01  5.10935634e-01]
 [-4.17816141e-01  9.54231817e-01]
 [-5.34174189e-01  1.02002524e+00]
 [-4.10541914e-01  1.23260934e+00]
 [-1.02949763e+00  6.07587585e-01]
 [-3.86267422e-01  9.22259506e-01]
 [-3.52232190e-01  8.55562515e-01]
 [-6.15755399e-01  1.34942703e+00]
 [-3.07248813e-01  9.33331056e-01]
 [-7.53261905e-01  4.28670276e-01]
 [-6.51235945e-01  7.71309234e-01]
 [-3.22710809e-01  4.59596802e-01]
 [-3.17693506e-01  5.73339963e-01]
 [-4.11730637e-01  6.13909701e-01]
 [-7.99871124e-02  3.30022093e-01]
 [-3.41071732e-01  8.42950674e-01]
 [-6.47408530e-01  7.43786865e-01]
 [-5.69702657e-01  4.95696187e-01]
 [-1.44808539e-01  4.79733823e-01]
 [ 2.91423033e-02  8.86930621e-01]
 [-3.11732015e-01  5.92555257e-01]
 [-7.04543313e-01  3.49512672e-01]
 [-5.33458423e-01  6.47422303e-01]]

至此,所有为了机器学习的前置工作都已经做完了.下一节课,我们将开始深入机器学习,探讨其中的算法.
核能预警 为学好机器学习,务必先学会数学.!!!以下是必备的数学知识:

  • 概率论初步
    • 几种概率分布(特别是二项分布和离散分布)
    • 边缘概率和条件概率及其链式法则
    • 期望和方差
  • 贝叶斯定理
  • 信息论

这里推荐一本书《Python深度学习:基于Tenserflow》.(虽说其实学完它你学到的比机器学到的更多).
祝 好运

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值