本文章主要用python语言完成斯坦福大学吴恩达机器学习的课程作业。课程作业原先使用的是 Octave 和 MATLAB。不过以目前发展趋势来看,无论是对 Machine Learning 的学习还是对未来工程项目的开发 Python 都更为合适。
1 输入一行代码,返回一个5×5的的单位矩阵
import numpy as np
print(np.eye(5))#或print(np.identity(5)) 不同之处在于后者只能创建方阵
2 单变量线性回归
题目: 假设你是一家连锁餐厅的首席执行官,正在考虑在不同的城市开设一家新餐厅。该连锁店已经在多个城市拥有卡车,你可以得到城市的利润和人口数据。
您希望使用这些数据来帮助您选择要扩展到哪个城市。文件ex1data1.txt包含我们的线性回归问题的数据集。第一列是一个城市的人口,第二列是一个城市的流动餐车的利润。利润为负数表示亏损。
2.1 读取 ex1data1.txt 中数据,并根据数据画出散点图。散点图x轴命名为(‘Population of City in 10,000s’),y轴命名为(‘Profit in $10,000s’);
import numpy as np
import matplotlib.pyplot as plt
local_data=np.loadtxt("ex1data1.txt",delimiter=",")
X=local_data[:,0]
y=local_data[:,1]#X是一个城市的人口,y是一个城市的流动餐车的利润。
plt.plot(X,y,"o")
plt.xlabel("'Population of City in 10,000s'")
plt.ylabel("Profit in $10,000s")
plt.show()
参数 | 含义 |
---|---|
delimiter | 加载文件分隔符 |
comment | 指行的开头为“···”时提过改行 |
skiprows | 跳过前“···”行 |
usecols | 加载数据文件中的列索引 |
2.2 计算代价
假设单变量线性回归的函数为:
代价函数为:
computeCost.py
import numpy as np
def computeCost(X, y, theta):
# Initialize some useful values
m = len(y) # number of training examples
error = np.dot(X,theta) - y
J = np.dot(error.T, error) / m/2
return J
对np.dot()函数的补充:
dot()返回的是两个数组的点积(dot product)
梯度下降:
gradientDescent.py
import numpy as np
from computeCost import computeCost
def gradientDescent(X, y, theta, alpha, num_iters):
# Initialize some useful values
m = len(y) # number of training examples
J_history = np.zeros((num_iters, 1))
for iter in range(num_iters):
error = np.dot(X,theta) - y
theta = theta - alpha * np.dot(X.T,error) / m
J_history[iter][0] = computeCost(X, y, theta)
return theta, J_history
预测
城市人口为35000和70000时的利润:
predict1 = [1, 3.5] * theta
predict2 = [1, 7] * theta
predict1 = np.dot(np.array([1, 3.5]),theta)
print('For population = 35,000, we predict a profit of %f\n'%(predict1*10000));
predict2 = np.dot(np.array([1, 7]),theta)
print('For population = 70,000, we predict a profit of %f\n'%(predict2*10000));
ex1.py
在这里插入代码片
对np.vstack()函数的补充:
np.vstack:按垂直方向(行顺序)堆叠数组构成一个新的数组
import numpy as np
array_f=np.array([1,2,3])
array_d=np.array([4,5,6])
result=np.vstack((array_f,array_d))
print(result)
>>>[[1 2 3]
[4 5 6]]
接下来的根据x预测y值,以及绘制三维图、等高线图题目中已给出,这里不再赘述。matlab中的画图函数surf和画等高线图函数contour可以自行百度。