python建模【头歌】

前言

爬虫作为一个大数据时代利器
关于数学建模方向也起着很大的作用
刚开始学建模因为时间仓促基础没打好就要开始写算法
以下总结我遇到的问题以及总结的知识点

向量

向量相加

a = eval(input())

b = eval(input())

c = 0.5

#********** Begin **********#


result=[]
result =[a_i + b_i for a_i,b_i in zip(a,b)]
result=[c*result_i for result_i in result]
#********** End **********#
print(result)

eval(input())

将用户输入的内容作为字符串传递给eval()函数作为表达式求值
白话说就是处理输入的值

a_i + b_i for a_i,b_i in zip(a,b)

循环a和b内各分量,并将各分量相加,后返回

矩阵

生成20*20的单位矩阵

def is_diagonal(i,j):
    return 1 if i==j else 0
matrix=[]
matrix=[[is_diagonal(i,j)
for j in range(20)] for i in range(20)]
# ********** End ********** #
print(matrix)
  • 先定义一个列表(放矩阵)
  • 循环两个指标以生成20*20的空矩阵
  • 再用函数is_diagonal将对角线上的元素变成1,其他都为0

矩阵乘法

def matxMultiply(A, B):
    # ********** Begin ********** #
    nrows,ncols = len(A),len(B[0])
    result = [[0]* ncols for _ in range(nrows)]
    for i in range(nrows):
        for j in range(ncols):
            for k in range(len(B)):
                result[i][j]+=A[i][k]*B[k][j]


    return result
    # ********** Begin ********** #        

a = [[2,5,8,0],[1,9,5,8],[3,9,4,8]]
b = [[3,5],[6,8],[11,30],[1,1]]
print(matxMultiply(a,b))
  • 首先要注意矩阵乘法后i行j列是ik×kj的所有和
    相当于一横×一竖
  • 所以设置三个变量,i和j负责循环行和列,k负责循环这一行/列的所有元素
  • k=len(B)因为3×4 4×2,len(B)是第二个矩阵的列也是第一个矩阵的行
  • result = [[0]* ncols for _ in range(nrows)]重置矩阵,用_占位符弄出一个空的3×2的矩阵(这一步很重要)

统计

坐标系

counter是用来处理数据的,将对应x和对应y放在一起方便画图

from collections import Counter
friend_counts = Counter(num_friends)
xs = range(101) # 最大值是100
ys = [friend_counts[x] for x in xs] # height刚好是朋友的个数
plt.bar(xs, ys)
plt.axis([0, 101, 0, 25])
plt.title("朋友数的直方图")
plt.xlabel("朋友个数")
plt.ylabel("人数")
plt.show()
um_points = len(num_friends) # 204
largest_value = max(num_friends) # 100
smallest_value = min(num_friends) # 1

在这里插入图片描述

平均数

def mean(x):
    return sum(x) / len(x)
mean(num_friends) 

中位数

p为你想求的百分数,如中位数为0.5

def quantile(x, p):
    p_index = int(p * len(x))
    return sorted(x)[p_index]
quantile(num_friends, 0.10) # 1
quantile(num_friends, 0.25) # 3
quantile(num_friends, 0.75) # 9
quantile(num_friends, 0.90) # 13

正常求法

def student(data):

    #********* Begin *********#

    data = sorted(data)
    size = len(data)
    if size % 2 == 0: # 判断列表长度为偶数
        median = (data[int(size/2)-1]+data[int(size/2)])/2
        data[0] = median
    if size % 2 == 1: # 判断列表长度为奇数
        median = data[int((size-1)/2)]
        data[0] = median
    print(data[0])
  • 注意return不返回值(不知道为什么),只能用print
  • 而且系统传递的参数直接给函数了,不需要在函数外边再引用data给函数
  • 若报错data无定义在函数内部写data = sorted(data),在外部写会报错list index out of range
  • data的index必须为int型,所以一定要约定,不分奇偶,否则报错

众数

def mode(x):
    counts = Counter(x)
    max_count = max(counts.values())
    return [x_i for x_i, count in counts.iteritems() if count == max_count]
mode(num_friends) # 1 和 6

极差

def data_range(x):
    return max(x) - min(x)
data_range(num_friends)

方差

def de_mean(x):
    x_bar = mean(x)# 平均数
    return [x_i - x_bar for x_i in x]#算差
def variance(x):
    n = len(x)
    deviations = de_mean(x)
    return sum_of_squares(deviations) / (n - 1)# 差平方求和后/n-1
variance(num_friends)

另一种稳定的方法

def interquartile_range(x):
    return quantile(x, 0.75) - quantile(x, 0.25)
interquartile_range(num_friends)

标准差

开方即可

def standard_deviation(x):
    return math.sqrt(variance(x))
standard_deviation(num_friends)

协方差

将每个数据减去平均数(de_mean在上面)后点乘除于n-1
在这里插入图片描述

def dot(v, w):
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

相关系数

def correlation(x, y):
    stdev_x = standard_deviation(x)
    stdev_y = standard_deviation(y)
    if stdev_x > 0 and stdev_y > 0:
        return covariance(x, y) / stdev_x / stdev_y
    else:
        return 0 # 如果没有变动,相关系数为零
correlation(num_friends, daily_minutes) # 0.25

协方差除以标准差之乘
1为正相关,-1为负相关,接近0为没有关系

其他

输出结果保留几(2)位数

num=3.14159
rounded_num=round(num,2)
print(rounded_num)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值