一、前言
由于暑假参加全国大学生智能汽车竞赛百度深度学习组竞赛和开学熬了两个星期的考试周,三个多月停更博客。赶紧抓住九月的尾巴来更新几篇最近课程相关的python练习题,有什么不对的地方,希望大家批评指正,共同进步,哈哈。
二、例题
1.请随机生成1000个二维数据点,从中分别随机抽取约75%,50%,25%的数据点,并绘图展示抽取数据点的情况。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/28 11:00
# @Author : Up_Long
# @FileName: 1.py
# @Software: PyCharm
import matplotlib.pyplot as plt
import random as rd
import numpy as np
x = [rd.gauss(0,1) for i in range(1000)]
y = [rd.gauss(0,1) for i in range(1000)]
z = [list(i) for i in zip(x,y)]
z1 = rd.sample(z,750)
z2 = rd.sample(z,500)
z3 = rd.sample(z,250)
z = np.array(z)
z1 = np.array(z1)
z2 = np.array(z2)
z3 = np.array(z3)
plt.subplot(221)
plt.title("100% of the points were randomly selected")
plt.scatter(z[:,0],z[:,1])
plt.subplot(222)
plt.title("75% of the points were randomly selected")
plt.scatter(z1[:,0],z1[:,1])
# plt.show()
plt.subplot(223)
plt.title("50% of the points were randomly selected")
plt.scatter(z2[:,0],z2[:,1])
# plt.show()
plt.subplot(224)
plt.title("25% of the points were randomly selected")
plt.scatter(z3[:,0],z3[:,1])
plt.show()
参考输出结果:
2.请计算生成正弦函数序列和余弦函数序列,并绘图展示。将正弦序列和余弦序列添加随机偏差(噪音)后再次绘图,观察噪音对数据的影响。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/28 11:16
# @Author : Up_Long
# @FileName: 2.py
# @Software: PyCharm
import matplotlib.pyplot as plt
import numpy as np
from math import *
x = np.arange(-6*pi,6*pi,0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.subplot(211)
plt.plot(x,y1,'r')
plt.plot(x,y2,'b')
z1 = y1 + np.random.randn(len(y1))
z2 = y2 + np.random.randn(len(y2))
plt.subplot(212)
plt.plot(x,z1,'y')
plt.plot(x,z2,'g')
plt.show()
参考输出结果:
3.验证几类变量变换的效果,包括:指数变换、>1幂变换、对数变换、(0,1)幂变换、<0幂变换、正弦变换,绘图演示各类变换的效果。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/28 11:25
# @Author : Up_Long
# @FileName: 3.py
# @Software: PyCharm
import matplotlib.pyplot as plt
import numpy as np
from math import *
x = np.linspace(1, 50, 100)
y1 = np.exp(x)
y2 = x ** 3
y3 = np.log10(x)
y4 = np.sqrt(x)
y5 = 1/x
y6 = np.sin(x)
plt.subplot(321)
plt.plot(x,y1)
plt.subplot(322)
plt.plot(x,y2)
plt.subplot(323)
plt.plot(x,y3)
plt.subplot(324)
plt.plot(x,y4)
plt.subplot(325)
plt.plot(x,y5)
plt.subplot(326)
plt.plot(x,y6)
plt.show()
参考输出结果:
4.为了提出变量量纲对数据分析的影响,经常需要对变量进行一定的变换,其中常用的一种是标准化(normalization)变换(即将数据序列转换为期望值为0和方差为1的序列),转换公式为:
其中为序列的均值,为序列的样本标准差,即
请随机生成一个序列,并生成它的标准化序列,将两个序列通过绘图展示出来。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/28 12:24
# @Author : Up_Long
# @FileName: 4.py
# @Software: PyCharm
import matplotlib.pyplot as plt
import numpy as np
from math import *
x = np.random.normal(1000,200,1000) #期望值即均值,标准差,值的个数
s = sqrt(sum((x-np.average(x))**2)/(len(x)-1))
y = (x-np.average(x))/s
print(y)
plt.subplot(211)
plt.plot(x)
plt.subplot(212)
plt.plot(y)
plt.show()
参考输出结果(其中随机生成的序列为期望值1000,标准差200,长度1000的正态分布序列):
5.距离计算
向量间的闵可夫斯基距离的定义如下:
其中当r=1时成为街区距离,为不同分量差绝对值的和
当r=2时即为欧几里得距离
当r=+infinity时,等于所有分量差绝对值中最大的一个
编写函数实现三种距离的计算,并对下面4个二维向量分别计算其三种距离定义的距离矩阵。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/28 13:32
# @Author : Up_Long
# @FileName: 5.py
# @Software: PyCharm
import numpy as np
from math import *
#闵可夫斯基距离公式
def suan(x,y,r):
if r < np.inf:
d = pow(sum(abs(x - y) ** r), 1/r)
elif r == np.inf: #趋近于正无穷时,公式趋近于max(|x2-x1|,|y2-y1|)
d = max(abs(x[0]-y[0]),abs(x[1]-y[1]))
return d
x = [0, 2, 3, 5]
y = [2, 0, 1, 1]
z = [list(i) for i in zip(x,y)]
# print(z)
z = np.array(z)
#原矩阵
print("Data Matrix:\n", z)
# print(z[0])
# print(z[1])
#街区距离矩阵
z1 = np.zeros((4, 4))
for i in range(0, 4):
for j in range(0, 4):
z1[i,j] = suan(z[i],z[j],1)
print("City Block Distance:\n",z1)
#欧几里得矩阵
z2 = np.zeros((4,4))
for i in range(0,4):
for j in range(0, 4):
z2[i,j] = suan(z[i],z[j],2)
print("Euclid Distance:\n",z2)
#分量差矩阵
z3 = np.zeros((4,4))
inf = float('inf')
for i in range(0,4):
for j in range(0, 4):
z3[i,j] = suan(z[i],z[j],inf)
print("Distance with Max Difference:\n",z3)
参考输出结果:
6.二元变量的相似度衡量可以使用简单匹配系数(SMC)或Jaccard系数
设x和y是两个对象,都由n个二元属性组成,这样两个对象可生成如下四个量(频率):
简单匹配系数(Simple Matching Coefficient, SMC)定义为:
Jaccard系数(Jaccard Coefficient)的定义为:
编写两个函数分别实现连个系数的计算,并生成两个随机序列调用函数计算。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/29 21:35
# @Author : Up_Long
# @FileName: 6.py
# @Software: PyCharm
import numpy as np
from math import *
def SCM(a,b):
sum = 0
for i in range(len(a)):
if a[i] == b[i]:
sum += 1
# print(sum)
scm = sum/len(a)
return scm
def Jac(a,b):
sum = 0
for i in range(len(a)):
if a[i] == b[i] == 1:
sum += 1
# print(sum)
jac = sum/len(a)
# print(jac)
return jac
a = np.random.randint(0,2,30)
b = np.random.randint(0,2,30)
print("Vector a is:\n",a)
print("Vector b is:\n",b)
print("SCM coefficient:\n",SCM(a,b))
print("Jaccard coefficient:\n",Jac(a,b))
参考输出结果:
7.余弦相似度是衡量数值向量相似度的一种方法,设x和y是两个n元向量,则余弦相似度定义为
编写函数实现余弦相似度的计算,并调用函数计算下面两个向量的余弦相似度。
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/9/30 10:02
# @Author : Up_Long
# @FileName: 7.py
# @Software: PyCharm
import numpy as np
def cos(x,y):
x1 = np.linalg.norm(x)
y1 = np.linalg.norm(y)
cos = (np.matmul(x,y))/(x1*y1) #matmul求乘积
print("Vector Angel Cosine:", cos)
x = [3, 2, 0, 5, 0, 0, 0, 2, 0, 0]
y = [1, 0, 0, 0, 0, 0, 0, 1, 0, 2]
x = np.array(x)
y = np.array(y)
cos(x,y)
参考输出结果: