• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Python编程及数据挖掘实现+MATLAB数据可视化方法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

目录

Python编程及数据挖掘实现

NumPy入门

1 数组

1.1 数组的创建

NumPy中的核心对象是ndarray,类似于matlab中的数组或矩阵,与matlab类似,NumPy里面所有的函数都是围绕ndarray展开。

(1)通过列表创建数组
import numpy as np  #导入numpy包,后续代码省略
a = np.array([1, 2, 3, 4])
print(a)
b = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
print(b)
(2)使用arange函数创建数组
a = np.arange(0,1,0.1)  #0开始,1结束,以0.1为间隔
print(a)
(4)使用linspace创建数组
a = np.linspace(0,1,10) #0到1之间生成间隔相同的10个数
print(a)
(5)创建特殊数组
#全零数组
a = np.zeros((2,3))
print(a)
#全1数组
a = np.ones((2,3))
print(a)
#单位阵
a = np.eye(3)
print(a)
#对角阵
a = np.diag([1,2,3])
print(a)
1.2 数组的属性
a = np.array([[1,2,3,4],[5,6,7,8]])
print(\'数组维数: \', a.ndim) #返回int,表示数组的维数
print(\'数组尺寸: \', a.shape) #返回tuple,表示数组的尺寸(n,m)
print(\'元素总数: \', a.size) #返回int,表示数组的元素总数
print(\'元素类型: \', a.dtype) #返回data-type,表示数组中元素类型
print(\'每个元素的大小: \', a.itemsize) #返回int,表示数组每个元素的大小(字节)
1.3 生成随机数
(1)生成均匀分布的随机数
a=np.random.rand(3,3);
print(a)
(2)生成正态分布的随机数
a=np.random.randn(3,3);
print(a)
(3)给定上下范围的随机整数,如创建一个[2,10]区间的3行3列数组
a=np.random.randint(2,10,[3,3]);
print(a)
random模块常用的随机数生成函数

1.4 数组访问
(1)一维数组访问
a=np.arange(10)
print(a)
#用整数作为下标可以获取数组中的某个元素
print( a[5] ) 
#用范围作为下标获取数组的一个切片,包括a[3]不包括a[5]
print( a[3:5] ) 
#省略开始下标,表示从a[0]开始
print( a[:5] ) 
#下标可以为负数,-1表示最后一个数
print( a[-1] )
#下标还可以用来修改元素的值
a[2:4]=[100,101]
print(a)
#范围中第三个参数表示步长,例如下面2表示隔一个元素取一个
print( a[1:-1:2] )
#步长为负数时,开始下标必须大于结束下标
print( a[5:1:-2] )
(2)多维数组的访问
a=np.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
print(a)
#访问第1行中第4列和5列的元素
print( a[0,3:5] )
#访问第2,3行中第3-5列的元素
print( a[1:3,2:5] )
或print( a[1:,2:] )
#访问第2列的元素
print( a[:,1] )
#使用整数访问数据,访问2,3行中0,2,3列的元素
print( a[1:,(0,2,3)] )
1.5 数组形状改变
(1)使用6reshape函数
a=np.arange(12)
print(a)
b=a.reshape(3,4)  #将数组的维度改为3行4列
print(b)
(2)使用flatten函数展平数组
a=np.arange(12).reshape(3,4)
print(a)
#横向展平
print( a.flatten() )
#纵向展平
print( a.flatten(\'F\') )

注意:reshape函数的参数中出现 -1 时,reshape函数会根据另一个参数的维度自动计算该参数的值,例如

a=np.arange(12)
print(a)
b=a.reshape(3,-1)  #只确定行数
print(b)
c=a.reshape(-1,4)  #只确定列数
print(c)
(3)组合数组
a=np.ones((2,2)); b=np.zeros((2,2))
#横向组合
c=np.hstack((a,b)) 
print(c)
c=np.concatenate((a,b),axis=1)
print(c)
#纵向组合
c=np.vstack((a,b))
print(c)
c=np.concatenate((a,b),axis=0)
print(c)

2 ufunc函数

2.1 基本运算

ufunc函数的四则运算函数与运算符效果一致:

a=np.ones((2,2)); b=2*np.ones((2,2));
#加法
c=a+b; print(c)
c=np.add(a,b); print(c)
#减法
c=a-b; print(c)
c=np.subtract(a,b); print(c)
#乘法
c=a*b; print(c)
c=np.multiply(a,b); print(c)
#除法
c=a/b; print(c)
c=np.divide(a,b); print(c)
#求幂
c=a**b; print(c)
c=np.power(a,b); print(c)

3 矩阵

3.1 矩阵的创建
#使用mat函数创建矩阵
a=np.mat(\'1 2 3; 4 5 6; 7 8 9\')
print(a)
#使用matrix函数创建矩阵
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
b=np.matrix(a)
print(b)
3.2 矩阵的运算
a*3  #矩阵乘以系数
a+b #矩阵相加
a-b  #矩阵相减
a*b  #矩阵乘法
np.multiply(a,b) #矩阵各元素相乘
3.3 矩阵的特有操作

例:

a=np.matrix([[1,2,3],[4,5,6],[7,8,9]])
print(a)
b=a.T
print(b)

4 常用函数

当axis=0时,表示沿着纵轴计算,当axis=1时,表示沿着横轴计算,默认时计算总的值,例如求和函数;

a=np.ones((2,3)); print(a)
print( np.sum(a) )
print( np.sum(a,axis=1) )
print( np.sum(a,axis=0) )

5 文件读写

NumPy文件读写主要有二进制文件和文本文件的形式。

(1)二进制文件读写

a=np.ones((5,5))
np.save(\'./file1\',a)
b=np.load(\'./file1.npy\')
print(b)

(2)文本文件读写

a=np.ones((5,5))
#savetxt函数是将数组写到某种分隔符隔开的文本文件中
np.savetxt(\'./file2.txt\',a,fmt=\'%d\',delimiter=\' \')
#loadtxt函数是把文件加载到一个二维数组中
b=np.loadtxt(\'./file2.txt\',delimiter=\' \')
print(b)
#genfromtxt函数面向结构化数组缺失数据
c=np.genfromtxt(\'./file2.txt\',delimiter=\' \')
print(c)

(3)mat文件读写

除了numpy,python中的scipy.io库还可以支持matlab中.mat文件的读写,从而可以保证matlab与python两个软件之间的数据互通。

主要函数:

读.mat文件:data = loadmat(\'datafile.mat\')
写.mat文件:savemat(\'datafile.mat\')

对超过两维的数组,复数数组,稀疏数组,函数数组,对象类,匿名函数类不支持。
示例:

import scipy.io as sio
data=sio.loadmat(\'imageclassification.mat\')
trainx=data[‘trainx’])#将data中trainx变量取出
testx=data[\'testx\'] #将data中testx变量取出

Matplotlib画图

除了Matplotlib外,python还有着第三方提供的大量的绘图包,常见的例如PyChart,plotly,bokeh等。对于特定的绘图需求,同学们可以根据需要在Github、百度等上搜索特定的绘图包。
本次课所介绍的可视化工具主要针对数据的可视化,对于其他绘图,例如框架图、流程图等,更推荐使用Visio软件进行绘制!

1 plotly简介

Plotly是一个开源的python可视化工具,可以画各种基础图形、统计图形、地图、金融图形、3D图形等,可在其主页https://plotly.com/python/ 查看其功能介绍和各种实例。

接下来以世界疫情图为例介绍plotly的功能

import pandas as pd
import plotly.graph_objects as go 

df = pd.read_excel(\'D:/暑期建模/code/world.xlsx\') 
fig = go.Figure(data=go.Choropleth( 
    locations=df[\'code\'], # 设置位置,国家的编号(缩写) 
    z = df[\'Num\'].astype(float), # 设置填充色数据 
    colorscale = \'Reds\', # 图例颜色 
    colorbar_title = "人数", # 图例标题 
)) 
 
fig.update_layout( 
    title_text = \'全球累计确诊人数\', # 地图标题 
    geo_scope=‘world’, # 设置地图的范围为全球 
    #scope可选有"world","usa","europe","asia","africa","north america","south america" 
) 
fig.write_html("D:/暑期建模/code/map.html") 

2 词云图(wordcloud包)

词云图适合表示和分析文本类型的数据,在今年的美赛中有涉及。在未来的数模竞赛中,同学们可能会碰到新的绘图需求,此时可以考虑查找python是否有相关的工具包,方便解决问题。

Wordcloud包的详细介绍可以参考其主页http://amueller.github.io/word_cloud/index.html。当处理中文时,可使用分词包jieba, nltk等。

数据挖掘工具Scikit-learn

scikit-learn基本实现了主流的数据挖掘/机器学习算法,功能大概和matlab的统计和机器学习工具箱相当。常用的分类、聚类、回归、降维算法都能在该工具箱中找到实现。
Anaconda工具包中已经包括了该库,可以直接调用,不需要进行安装。
该库的介绍网址:
https://scikit-learn.org/stable/index.html

1 预处理(sklearn.preprocessing:)

(1)标准化preprocessing.scale

类似于matlab中的zscore函数,其使用示例如下:

from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
X_scaled = preprocessing.scale(X_train)
print(X_scaled)
结果为:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
(2)范围变换preprocessing.minmax_scale

将数据的尺度变换至指定的范围,示例如下:

X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)
结果为:
[[0.5        0.         1.        ]
 [1.         0.5        0.33333333]
 [0.         1.         0.        ]]
(3)分类数据编码

在一些数据分析问题中,需要将类别编码为整数,便于后续的分类、回归等处理,主要两种编码方式。
整数编码示例如下:

enc = preprocessing.OrdinalEncoder()
X = [[\'male\', \'from US\', \'uses Safari\'], [\'female\', \'from Europe\', \'uses Firefox\'],[\'female\', \'from Africa\', \'uses IE\']]
enc.fit(X)
X_enc=enc.transform([[\'female\', \'from US\', \'uses Safari\']])
label=enc.inverse_transform(X_enc)
结果:
array([[0., 2., 2.]])
array([[\'female\', \'from US\', \'uses Safari\']], dtype=object)
0-1编码示例如下:
genders = [\'female\', \'male\']
locations = [\'from Africa\', \'from Asia\', \'from Europe\', \'from US\']
browsers = [\'uses Chrome\', \'uses Firefox\', \'uses IE\', \'uses Safari\']
enc = preprocessing.OneHotEncoder(categories=[genders, locations, browsers])
X = [[\'male\', \'from US\', \'uses Safari\'], [\'female\', \'from Europe\', \'uses Firefox\']]
enc.fit(X)
X_onehot=enc.transform([[‘female’, ‘from Asia’, ‘uses Chrome’]]).toarray() #结果保存为稀疏形式,转为为数组格式

结果:

array([[1., 0., 0., 1., 0., 0., 1., 0., 0., 0.]])
(4)文本处理

sklearn.feature_extraction.text模块能够提取文本特征,将文本转化为向量,供后续的处理。
常用的特征提取方法有:

词频向量:CountVectorizer
TF-IDF向量:TfidfVectorizer

示例:统计文本词频,根据词频热度画词云图

import numpy as np
from wordcloud import WordCloud
from sklearn.feature_extraction.text import CountVectorizer

# 打开文件,读取每行文本

data=[]
with open(\'test.txt\',encoding=\'UTF-8\') as f:
    for line in f.readlines():
        data.append(line)

# 统计每行文本的词频,并计算每个单词的总词频

vectorizer = CountVectorizer(stop_words=\'english\')
X = vectorizer.fit_transform(data).toarray()
count=np.sum(X,axis=0)
name=vectorizer.get_feature_names()
text=dict(zip(name,count))

# 根据词频生成词云图

w = WordCloud(background_color=\'white\',width=800, height=400,max_words=10)
w.generate_from_frequencies(text)

# 保存文件

w.to_file(\'wordcloud.png\')

2 回归方法

(1)线性回归模块sklearn.linear_model

Scikit-learn中的回归方法主要集中在模块sklearn.linear_model
该模块中包括常用的多种线性回归方法

基本线性回归:LinearRegression
带L2正则项的岭回归:Ridge
带L1正则项的回归:lasso
Logistic回归(实际上是分类):LogisticRegression
结合L1和L2正则项的弹性网络:ElasticNet
……

这里仅列出了使用较多的线性回归方法的函数名,实际上该模块中包括大量其他的线性回归的扩展方法。对于同一个模块下的不同方法,函数的使用方式基本上一致,只是函数名不同。因此只需要掌握其中一种方法即可,在实际编程中根据需要再选择不同方法。

(2)非线性回归模块

典型的模块包括核岭回归以及支持向量机模块中的回归方法

核岭回归:sklearn.kernel_ridge
支持向量回归:sklearn.svm.SVR

示例

3 分类模块

常用方法包括如下模块或函数:

1 Logistic回归:sklearn.linear_model.LogisticRegression
2 支持向量机:sklearn.svm
3 神经网络:sklearn.neural_network(也可用于回归)
4 增强学习:sklearn.ensemble

增强学习模块包括多种方法,例如:

(1)Adaboost: AdaBoostClassifier
(2)随机森林:RandomForestClassifier
   ……

不同的分类方法使用方式基本一致,下面以支持向量机和神经网络为例介绍Scikit-learn中如何使用分类函数。

支持向量机

下面的代码是使用支持向量机进行手写字体的分类:

import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
#导入库中自带数据集
digits=datasets.load_digits()
n_samples = len(digits.images)
data=digits.images.reshape((n_samples,-1))
#建立一个SVM分类器
classifier=svm.SVC(gamma=0.001)
#使用数据集中的前一半进行训练,//为整数除法
classifier.fit(data[:n_samples//2],digits.target[:n_samples//2])
#预测数据集后半部分的标签
expected=digits.target[n_samples//2:] #真实标签
predicted=classifier.predict(data[n_samples//2:]) #预测标签
print("Classification report for classifier %s:\n%s:\n"
      % (classifier,metrics.classification_report(expected,predicted)))
#显示数据集中前4个图片以及对应的真实标签
images_and_labels=list(zip(digits.images,digits.target))
for index, (image, label) in enumerate(images_and_labels[:4]):
    plt.subplot(2,4,index+1)
    plt.axis(\'off\')
    plt.imshow(image,cmap=plt.cm.gray_r,interpolation=\'nearest\')
    plt.title(\'Training: %i\' %label)
n_samples=len(digits.images)
#显示数据集中后半部分的前4个图片以及对应的预测标签
images_and_predictions=list(zip(digits.images[n_samples//2:],predicted))
for index, (image,prediction) in enumerate(images_and_predictions[:4]):
    plt.subplot(2,4,index+5)
    plt.axis(\'off\')
    plt.imshow(image,cmap=plt.cm.gray_r,interpolation=\'nearest\')
    plt.title(\'Prediction:%i\' % prediction)
神经网络

神经网络的使用与支持向量机基本一致:

import matplotlib.pyplot as plt
from sklearn import datasets, neural_network, metrics
#导入库中自带数据集
digits=datasets.load_digits()
n_samples = len(digits.images)
data=digits.images.reshape((n_samples,-1))
#建立一个神经网络分类器,两个隐藏层,节点数分别为1000,500
classifier=neural_network.MLPClassifier(hidden_layer_sizes=(1000,500))
#使用数据集中的前一半进行训练,//为整数除法
classifier.fit(data[:n_samples//2],digits.target[:n_samples//2])
#预测数据集后半部分的标签
expected=digits.target[n_samples//2:] #真实标签
predicted=classifier.predict(data[n_samples//2:]) #预测标签
print("Classification report for classifier %s:\n%s:\n"
      % (classifier,metrics.classification_report(expected,predicted)))

4 聚类

sklearn.cluster模块提供了多种聚类方法,常见的有:

AP聚类:AffinityPropagation
层次聚类:	Agglomerative Clustering
DBSCAN聚类:DBSCAN
K均值聚类:Kmeans
谱聚类:SpectralClustering
……

5 数据降维

这里主要介绍基于矩阵分解的数据降维,其在数据处理和分析中应用非常广泛,对应的模块为sklearn.decomposition,常见的方法包括

基于稀疏编码的字典学习:DictionaryLearning
因子分析:FactorAnalysis
主成分分析(PCA): PCA
基于核函数的PCA:KernelPCA
潜在狄利克雷分配:LatentDirichletAllocation
非负矩阵分解 : NMF
……
数据降维分析文本主题

这里使用NMF将文本向量降3维,降维后的每一维可以看成是一个主题。

其他的Python资源

1 常用的Python包
科学计算:Scipy, 能实现各种数值计算方法与优化算法等
深度学习:TensorFlow, Pytorth
网页爬虫:BeautifulSoup, Scrapy
2 常用的Python开源代码(资源)网站

GitHub

MATLAB数据可视化方法

下面关于Matlab数据可视化方法的介绍,都基于一个基本的假设,就是大家都已经具备了Matlab的基本知识(了解Matlab的语法,能够使用Matlab进行数据的读取、运算等操作),并能熟练地查阅相关的Matlab函数。

为了使数据可视化,我们的基本步骤是:

  1. 准备数据;
  2. 选择合适的绘制图形函数;
  3. 选择窗口和位置;
  4. 编辑图形标注和说明;
  5. 输出或保存图形。

1 性图函数plot

2 简易线性函数图ezplot

3 散点图scatter

4 极坐标图polar

5-9 其他图

  1. 条形图
  2. 饼图
  3. 阶梯图
  4. 茎干图
  5. 平面多边形的着色

10 三维特殊图形

三维立体图的绘制,其中一部分绘制函数可在二维平面图形绘图函数的基础上添加数字3来实现。例如三维线性图函数为plot3,三维散点图为scatter3,三维条形图为bar3, barh3,三维饼图为pie3,三维茎干图为stem3等。但是三维立体图又增加了不少新的功能。网格图,表面图,视角控制,光照,透明度控制等。

11 三维网格图

网格图是把观察范围的x,y平面设置成均匀分布的网格,在网格的交叉点取z轴的点, z= f(x,y),随后把相邻的空间点用直线.连起来,则构成单元网格,单元网格可以是三角形的或四边形的,观察范围内的单元网格的总和构成三维网格图。单元网格为四边形的网格图的书写格式为:

mesh(X,Y,Z,C);
meshc(X,Y,Z,C);
meshz(X,Y,Z,C);    
h = mesh(..);
h = mesthe(..);
h = mesh(..)

12 三维表面图

三维网格图(mesh)的网格线是彩色的,并且它的色彩随着z轴的高度而改变。三维表面图(surf) 的网格线和网格单元表面也随着z轴坐标的高度而改变,因此它的立体感将更强。三维表面图的书写格式为:

surf(Z);
surf(X,Y,Z);
surf(X,Y,Z,C);
srurf.(.--);
h= surf(--)

13 简易表面图

为了绘制表面图的方便,而设置了简易表面图函数ezsurf,它不用设置自变量的间隔向量,线 宽、标记点、颜色,只要知道函数的符号表达式即可绘出函数图形。

14 柱形立体图

柱形立体图是由柱形图函数cylinder产生X, Y, Z的坐标矩阵,随后由mesh或surf产生柱形网格图或表面图。柱形图函数cylinder的书写格式为:

[X,Y,Z] = cylinder;
[X,Y,Z] = cylinder(r);
[X,Y,Z] = cylinder(r,n);
cylindr(--)

15 图形格式的设置

当使用Matlab绘制函数,绘制好图形之后,为了丰富图形的内涵,还必须对图形添加标题、坐标轴标签、文字说明、图例、辅助线、提示线等。

Matlab可以通过三种方式对图形进行标注。
(1)从图形中直接标注。
(2)使用图形标注函数进行标注。
(3)使用图形的属性编辑器。

(1) 从图形中直接标注。

点击图形窗口中的插入菜单(Insert),在插入菜单中有子菜单x、y、z,label(坐标轴标签), title(标题),legend(图例),colorbar(色彩分层),arrow(箭头),line(辅助线), text(文本说明),axes(坐标轴设置),light (光照设置)等供标注或设置。

(2) 使用图形标注函数进行标注。

使用图形标注函数,可以直接从程序中编写,当执行程序后,图形中自动添加了图形标注。
常用图形标注函数如下:

title:建立图形标题;
xlabel:建立x轴标签;
ylabel:建立y轴标签;
zlabel:建立z轴标签;
legend:在图形中添加图例;
text:在指定位置添加文本说明;
gtext:使用鼠标在图形某个位置插入文本;
grid:栅格线显示控制,grid on为显示栅格线,grid off为取消栅格线;
hold:图形保持控制,hold on保持当前图形,hold off为取消图形保持;
subplot:在图形窗口,建立子窗口;
figure:新建图形窗口;
plotedit:打开图形编辑窗口;
axes:建立坐标轴图形对象;
axis:建立坐标刻度和范围。

(3) 使用图形的属性编辑器。

在当前图形的菜单栏中选择Edit/Figure Properties并点击,即进入图形的属性编辑器。在编辑器里能对图形、线条、坐标、颜色、视角、光照进行编辑和设置。

16 视角与色彩控制

Matlab能够让用户指定观察点和视角。你可以通过图形属性编辑器或者使用view命令去指定这些观察特征。

view的书写格式为:

view(az,el):设置方位角和仰角
view([az,el]):设置方位角和仰角
view([x,y,z]):设置视角用笛卡尔直角坐标,它的幅值是忽略的
view(2):设置二维视角,默认值为az= 0°,el= 90°,即从z轴上方观看
view(3):设置三维立体图的视角,默认值为az=-37.5",el= 30°
view(az,el): az是 azimuth (方位角)的缩写,是观察点和坐标原点连线在xy平面的投影和y轴负方向的夹角,逆时针方向为正。el是
elevation(仰角)的缩写,是观察点和坐标原点连线和xy平面的夹角。当观察者的眼睛在xy平面上时,el=0,向上el为正,向下为负。它们均以度为单位。系统缺省的视点定义为方位角-37.5°,仰角30°。

当前图形的颜色设置和获取是由colormap (色图)函数来实现的。
colormap的书写格式为:

colormap name
colormap default
colormap(map)
cmap = colormap

第一种格式是指定色彩函数名称设置。由于色彩矩阵的设置是比较费时的,因此Matlab设置了一些色彩函数,用户选择色彩函数名即可。

第二种格式是默认的设置。

第三种格式是图形的颜色设置,颜色的分配是由矩阵map决定。
map是mx 3的矩阵,它的每- -元素是0.0~1.0之间的实数,它的每一行的RGB (色彩)向量,定义一-种颜色。图形有k行,colormap就确定k行颜色,map(k,:)= [r(k), g(k), b(k)]指定红、绿、蓝3色的深度。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
CIFAR10数据集 matlab可视化及理解发布时间:2022-07-18
下一篇:
matlab初学第三课•Layton大讲堂之 matlab简单的数据可视化发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap