集智专栏
资源加载中,请稍后...
集智专栏

[2018.03.27直播] Python数值计算:NumPy(III)

Kaiser

往期回顾

负基础入门Python系列汇总


直播时间 21:00

1. 页内观看(仅视频)

2. 完整观看(可发弹幕):Python数值计算:NumPy(II)

3. Bilibili直播



29. NumPy线性代数

29.1 向量加减法

  • 尝试用NumPy完成向量的加减操作,把结果赋值给u_add_v_np
程序说明
vector add/subtract
示例代码
u = [1,1,2,3,5,8] v = [1,1,4,5,1,4] # without numpy u_add_v = [ui + vi for ui, vi in zip(u,v)] print(u_add_v) # with numpy # >>>> show me the code <<<< u_add_v_np = # >>>> show me the code <<<<
正确答案
u_np = np.array(u) v_np = np.array(v) u_add_v_np = u_np + v_np
程序验证过程
all(u_add_v_np == np.array([2, 2, 6, 8, 6, 12]))
提示信息
np.array()将u,v转换成ndarray


29.2 向量点乘

  • 尝试用NumPy完成向量的点乘操作,把结果赋值给u_dot_v_np
程序说明
vector add/subtract
示例代码
u = [1,1,2,3,5,8] v = [1,1,4,5,1,4] # without numpy u_dot_v = sum([ui * vi for ui, vi in zip(u,v)]) print(u_dot_v) # with numpy # >>>> show me the code <<<< u_dot_v_np = # >>>> show me the code <<<<
正确答案
u_np = np.array(u) v_np = np.array(v) # sum() u_dot_v_np = sum(u_np * v_np) # .sum() u_dot_v_np = (u_np * v_np).sum() # np.dot() u_dot_v_np = np.dot(u_np, v_np)
程序验证过程
u_dot_v_np == 62
提示信息
np.array()将u,v转换成ndarray


29.3 矩阵

程序说明
Matirx
示例代码
import numpy as np # Matrix A = np.matrix([[3,5,3], [7,7,5], [0,7,6]]) print("A -> \n", A) # Identity Matrix I = np.eye(6) print("\nI -> \n", I) # Diagonal Matrix D = np.diag([0,1,2,3,4]) print("\nD -> \n", D)


29.4 矩阵计算

  • 求解方程组,将答案赋值给X
程序说明
Matrix
示例代码
import numpy as np A = np.matrix([[1,1,4], [5,1,4], [8,1,0]]) # 矩阵转置 print("A.T -> \n", A.T) # 矩阵求逆 print("\nA.I -> \n,", A.I) # 解方程组 A = np.matrix([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) b = np.matrix([[1], [2], [3]]) # A * X = b # X = ? # >>>> show me the code <<<< X = print("\nX -> \n", X) # >>>> show me the code <<<<
正确答案
X = A.I * b # X = linalg.solve(A, b)
程序验证过程
all(X == A.I * b)
提示信息
利用矩阵求逆


30. NumPy统计概率

30.1 方差(variance)

$$ \bar x = \sum_i^n(x_i) / n $$

$$ var(x) = \sum_i^n(x_i - \bar x)^2 / n $$

30.2 协方差(covariance)

$$ cov(x,y) = \sum_i^n(x_i - \bar x)(y_i - \bar y) / n $$


np.cov(x,y)

程序说明
协方差矩阵
示例代码
x = np.array([56,42,72,36,63,47,55,49,38,42,68,60]) y = np.array([147,125,160,118,149,128,150,145,115,140,152,155]) varx = ((x - x.mean())**2).mean() covxy = ((x - x.mean()) * (y - y.mean())).mean() print('var(x) -> ', varx) print('x.var() -> ', x.var()) print('cov(x,y) -> ', covxy) xy = np.vstack((x,y)) covmat = np.cov(xy) print('np.cov(xy) -> \n', covmat)


Quiz 31. 线性回归


$$ y = a_0 + a_1 x $$

$$ a_1 = \frac{\sum(x - \bar x)(y - \bar y)}{\sum(x - \bar x)^2}$$

$$ a_0 = \bar y - a_1 \bar x $$

  • 请完成函数linear_regression()的定义,输入两串列表x,y,返回a0, a1(保留4位小数)
程序说明
Linear Regression
示例代码
import numpy as np def linear_regression(x, y): x = np.array(x) y = np.array(y) # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
def linear_regression(x, y): x = np.array(x) y = np.array(y) x = np.array(x) y = np.array(y) a1 = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean())**2).sum() a0 = y.mean() - a1 * x.mean() return round(a0, 4), round(a1, 4)
程序验证过程
linear_regression([25,30,35,40,45,50],[78,70,65,58,48,42]) == (114.381, -1.4457) and linear_regression([25,30,35,40,45,50],[78,70,65,58,48,42]) == (114.381, -1.4457) and linear_regression([0,10,20,30,40],[0.51,0.55,0.57,0.59,0.63]) == (0.514, 0.0028)


Think

如果x的维度继续提高?

程序说明
Multivariable Linear Regression
示例代码
from sklearn import datasets diabetes = datasets.load_diabetes() X = diabetes.data print('X.shape -> \n', X.shape) y = diabetes.target print('y.shape -> \n', y.shape) linear_regression(X, y)

您也许喜欢这些文章

集智专栏

[Python入门] 01 基本法则

发表至系列教程
Python入门教程系列的第一篇,从最基本的概念与法则开始,面向从未接触过Python甚至没有任何编程基础的读者。 Python是数据科学界最主流的编程语言,相对于传统的Excel等数据处理工具,Python具备处理海量数据的能力,并且可以执行机器学习算法。从数据获取(网络爬虫等工具)、数据清理到数据分析拟合再到最终的可视化呈现,Python都能胜任。
集智专栏

玩儿懂深度学习Part 3:搭建深度神经网络

发表至系列教程
这是《玩儿懂深度学习》系列文章的第三篇,进一步详细介绍 Tensorflow 中 Keras 工具包提供的几种深度神经网络模块。
集智专栏

玩儿懂深度学习Part 5:文字的识别与定位

发表至系列教程
这是《玩儿懂深度学习》系列文章的第五篇,以车牌识别(是真的车牌)和简单OCR为例,谈了谈如何进行字母、数字的识别以及定位。

文章评论(6)

Kaiser集智 站长 发表于 3月前回复
回复为父笑而不语:下次直播遥遥无期啊=_=是我错过了还是没开始呢?
最近收费课程开班了,所以主要忙那块儿,这个系列最近也会重新开始的。
为父笑而不语 发表于 4月前回复
下次直播遥遥无期啊=_=是我错过了还是没开始呢?
AndaMon 发表于 4月前回复
问一下大家,quiz31那里如果按照k神那样写 a1 = (x - x.mean())*(y - y.mean()).sum() / ((x-x.mean())**2).sum() a0 = y.mean()-a1 * x.mean() 输出的a1,a0 类型都是ndarray,无法通过测试,但是如果拆开来写就是输出的是浮点数,才能通过测试。 想请问一下大家这是什么原因
AndaMon 发表于 4月前回复
回复AndaMon:中间方差那里为什么math error...
噢噢,刷新下就好了
AndaMon 发表于 4月前回复
中间方差那里为什么math error...
WilhelmTNT 发表于 4月前回复
两个值不一样是因为自由度不一样