文章目录
在学习完基本的一些内容后,我们可以开始接触数据了.
在日常生活中,我们的一举一动都可以是一个数据.那么,我们就先需要一个载体来存储它们.
于是,计算机应运而生.一开始,人们只能用二进制、十六进制等来存储数据,不仅不方便,速度还慢.后来,我们有了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)中.你可以把每一个数据表想象为一个表格,而数据库就是装着表格的文件夹.我们必须先创建文件夹,然后才能在文件夹中创建数据表,最后写入数据.
数据表分为表头和数据两块.每个表头就是一列,例如有数据表如下:
userid | name | description |
---|---|---|
1 | Alex | A boy |
2 | Joanna | A 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) | 只能为1 | boolean |
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
- 在声明列的数据类型后,有三个可选的内容,分别是:
-
null
或not 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
中,分别对应列name
和description
.注意一下,在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
wi∈Rn且为标准正交基向量,即
∣
∣
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)
∣∣wi∣∣2=1 , wiTwj=0(i=j)
此时我们有
X
∗
=
W
Z
=
W
⋅
W
T
X
\mathbf{X^*=WZ=W·W^\mathrm{T}X}
X∗=WZ=W⋅WTX
而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∣∣X−X∗∣∣F2=minw∣∣X−W⋅WTX∣∣F2.
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)+λ(I−WTW)
两边求导得
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》.(虽说其实学完它你学到的比机器学到的更多).
祝 好运