1. 获取数据

假设你是一家连锁店的老板,希望在另一个城市开分店,现在有一组城市的人口与利润的关系图, 通过这些数据预测不同人口的城市的利润 数据可以通过这个连接下载

# 导入模块
import numpy as np
import pandas as pd
import matlib.pyplot as plt

# 读取数据
data = pd.read_csv('ex1data1.txt', names=['Population','Profit'], header=None) #设置列名
# 画出数据的散点图查看
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
plt.show()

如图:
example1

2.梯度下降

梯度下降: 假设 y = f(x), 求y最小值时候的x. 则 梯度 Δ = f'(x) 设定好一定的步长 λ x <-- x - λ*Δ 代理初始的x后每次迭代x都往梯度下降的方向挪动一定的步长(其中Δ控制方向)。 迭代多次后,当两次x带入后获取的y数值相差极小时,此时的x为最优解

3.实现简单的线性回归

只有一个因素影响数据, 假设直线 Y = theta0 + theta1X1
转换为向量的思想,则:Y = theta
(1, X) formula

误差计算方法: formula

即: formula

def computeCast(X, Y, theta):
"""
计算误差的方法
X: 输入的数据,格式:[[1,2],[1,3],[1,4]...]
Y: 实际结果, 格式:[[1],[2],[3]...]
theta: 参数, 向量,格式:[0,0]
"""
error = np.sqrt(np.power(((X*theta.T) - Y), 2))
return np.sum(error)/(len(X)*2) #TODO 为什么要多除一个2?

# 例
theta = np.matrix(np.array([0,0]))
cost = computeCast(X, Y, theta)
print cost # 32.0727338775

使用梯度下降的方法调节参数theta,获取最小数据差异的结果
具体为:

根据复合函数求导,对误差e求theta偏导,获取梯度Δ: formula 根据梯度下降的公式:x <-- x - λ*Δ,每次迭代,重复梯度下降的过程. 代码流程为:

  1. 设定初始的theta值,迭代次数iters,步长alpha
  2. 根据 梯度下降的公式不断修改 theta
  3. 根据迭代次数重复上一个步骤
def gradientDescent(X, Y, theta, alpha, inters):
"""
梯度下降方法
alpha: 步长
inters: 迭代次数
"""
temp = np.zeros(theta.shape) # 用于缓存theta
arguments = int(theta.ravel().shape[0]) # theta的元素数量
cost = np.zeros(len(X)) # 用于保存每次迭代后theta所对应的误差
for i in xrange(iters):
error = X*theta.T - Y
for j in xrange(arguments): # 修改参数的每一个元素
term = np.multiply(error, X[:,j])
temp[:,j] = theta[:,j] - (alpha/len(x)) * np.sum(term)
theta = temp
cost[i] = computeCast(X, Y, theta)
return theta, cost

4. 观察结果

设定一些参数,运行

theta = np.matrix(np.array([0,0]))
alpha = 0.01
inters = 1000
g, cost = gradientDescent(X, Y,theta, alpha, iters)
print g # [[-3.24140214 1.1272942 ]]
print cost[-1] # 4.51595550308

根据得到的theta画出预测的直线

x_array = np.linspace(data.Populcation.min(), data.Populocation.max(), 1000)
y_array = theta[:,0] + theta[:,1] * x_array
fig, ax = plt.subplots(figsize=(12,8))

ax.plot(x_array, y_array, 'r', label='Prediction') # 画出预测曲线,红色
ax.scatter(data.Populcation, data.Profit, label='traning data') # 画出训练数据
ax.legend(loc=2) # 提示,标注
ax.set_xlabel('Populocation') # 横坐标
ax.set_ylabel('Profit') # 纵坐标
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

如图:
example2

5.查看迭代次数与误差的关系

# 尝试画出 iters - cost 的曲线
fig , ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('iters')
ax.set_ylabel('cost')
ax.set_title('iters vs cost')
plt.show()

如图:
example3

  • FROM

指定容器基于哪个基础镜像创建

  • MAINTAINER

设置镜像的作者

  • RUN

在容器中运行的命令

  • ADD

复制文件指令, destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件

  • CMD

提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效,CMD有三种形式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

  • EXPOSE

指定容器运行在监听的端口

  • ENTRYPOINT

配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:

ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2

  • WORKDIR

指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:

WORKDIR /path/to/workdir
  • ENV

设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:

ENV <key> <value>
  • USER 镜像正在运行时设置一个UID。语法如下:
USER <uid>
  • VOLUME

授权访问从容器内到主机上的目录。语法如下:

VOLUME ["/data"]

例子:

FROM localhost:5000/ubuntu:14.4
MAINTAINER wudizhangzhi
ADD localfile.txt /home/targetfile.txt
WORKDIR /home/
RUN pip install -r targetfile.txt
EXPOSE 7777
docker build -t wudizhangzhi/ubuntu:latest .

1.本地Registry的部署

运行下面命令获取registry镜像

sudo docker pull registry:2.1.1 # tag版本号随意设置

然后启动一个容器

sudo docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1

Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。

运行docker ps 查看容易运行情况

docker ps

启动了registry服务,打开浏览器输入http://127.0.0.1:5000/v2 ,出现下面情况说明registry运行正常

curl localhost:5000/v2
返回{}

2.验证

我的机器上有个hello-world的镜像,我们要通过docker tag将该镜像标志为要推送到私有仓库,

sudo docker tag hello-world:1.0.0 127.0.0.1:5000/hello-world:1.0.0

sudo docker push 127.0.0.1:5000/hello-world:1.0.0

验证

curl http://127.0.0.1:5000/v2/_catalog
返回json

logo
0%