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