【Python & 数据挖掘】Python实现简单公式及绘图

一、前言

由于暑假参加全国大学生智能汽车竞赛百度深度学习组竞赛和开学熬了两个星期的考试周,三个多月停更博客。赶紧抓住九月的尾巴来更新几篇最近课程相关的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)

参考输出结果:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Up_Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值