python 积分求解 以及 SVD分解后损失值计算

积分求解:使用scipy.integrate.quad()

def f(x):
    return math.sin(x)
a = integrate.quad(f,0,math.pi)
print(a)

积分求解:不使用scipy.integrate.quad()

步长分别为0.1 0.01 0.001

def yi():
    max1 = 0
    n = math.pi/0.1
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.1 * math.sin(i*0.1)
    print(max1)

def yi1():
    max1 = 0
    n = math.pi/0.01
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.01 * math.sin(i*0.01)
    print(max1)


def yi2():
    max1 = 0
    n = math.pi/0.001
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.001 * math.sin(i*0.001)
    print(max1)

svd分解求损失值:

def svd_f():
    M = np.random.rand(100,50)
    U,S,V = scipy.linalg.svd(M)
    print("随机取的矩阵:M")
    print(M)
    print("svd 分解后得")
    print("U:")
    print(U)
    print("S:")
    print(S)
    print("V:")
    print(V)
    ss = np.argsort(S)
    k = 10
    #去除前10个最大特征值的索引
    k_s = ss[:k]
    #去除前10个特征值对应的矩阵
    Uk = U[:,k_s]
    H = [[0.0 for i in range(k)] for i in range(k)]
    Sk = S[k_s]
    for i in range(k):
        H[i][i] = Sk[i]
    Vk = V[k_s,:]
    print()
    print(f"U变形后的矩阵行数与列数为{np.shape(Uk)}")
    print(f"S变形后的矩阵行数和列数为{np.shape(H)}")
    print(f"V变形后的矩阵行数和列数为{np.shape(Vk)}")
    Mk1 = np.dot(Uk,H)
    Mk = np.dot(Mk1,Vk)
    print("MK:")
    print(Mk)
    print()
    # 计算损失值
    Loss = 0
    for i in range(100):
        for j in range(50):
            Loss = Loss + (abs(M[i][j] - Mk[i][j]) / abs(M[i][j]))
    print(f"前10个特征值相乘的矩阵与原始矩阵的损失值为:{Loss / (100 * 50)}")
    

完整代码:

import math
import random
import numpy as np
import scipy.linalg
from scipy import integrate

def f(x):
    return math.sin(x)

def yi():
    max1 = 0
    n = math.pi/0.1
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.1 * math.sin(i*0.1)
    print(max1)

def yi1():
    max1 = 0
    n = math.pi/0.01
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.01 * math.sin(i*0.01)
    print(max1)


def yi2():
    max1 = 0
    n = math.pi/0.001
    n = int(n)
    for i in range(n):
        max1 = max1 + 0.001 * math.sin(i*0.001)
    print(max1)


def svd_f():
    M = np.random.rand(100,50)
    U,S,V = scipy.linalg.svd(M)
    print("随机取的矩阵:M")
    print(M)
    print("svd 分解后得")
    print("U:")
    print(U)
    print("S:")
    print(S)
    print("V:")
    print(V)
    ss = np.argsort(S)
    k = 10
    #去除前10个最大特征值的索引
    k_s = ss[:k]
    #去除前10个特征值对应的矩阵
    Uk = U[:,k_s]
    H = [[0.0 for i in range(k)] for i in range(k)]
    Sk = S[k_s]
    for i in range(k):
        H[i][i] = Sk[i]
    Vk = V[k_s,:]
    print()
    print(f"U变形后的矩阵行数与列数为{np.shape(Uk)}")
    print(f"S变形后的矩阵行数和列数为{np.shape(H)}")
    print(f"V变形后的矩阵行数和列数为{np.shape(Vk)}")
    Mk1 = np.dot(Uk,H)
    Mk = np.dot(Mk1,Vk)
    print("MK:")
    print(Mk)
    print()
    # 计算损失值
    Loss = 0
    for i in range(100):
        for j in range(50):
            Loss = Loss + (abs(M[i][j] - Mk[i][j]) / abs(M[i][j]))
    print(f"前10个特征值相乘的矩阵与原始矩阵的损失值为:{Loss / (100 * 50)}")

def main():
    print("积分方案一:")
    a = integrate.quad(f,0,math.pi)
    print(a)
    print()
    print("积分方案二:")
    print("步长为0.1:")
    yi()
    print("步长为0.01:")
    yi1()
    print("步长为0.001:")
    yi2()
    print()
    print("奇异值分解(SVD)特征值取前10为例:")
    svd_f()


main()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慕仙少白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值