• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

吴恩达机器学习课程作业(一)基于python实现 详细解析

python 奥利了奥 2455次浏览 0个评论

@单变量线性回归

前言

斯坦福大学吴恩达老师的机器学习课程几乎是每位热爱人工智能领域同学的必修课。网上虽然有许多基于python实现的代码,但大多使用python交互模式解释器ipython实例讲解。本人基于自己的理解采用pycharm提供源代码及个人理解,部分代码可能参考他人代码部分,如有侵权请私信我

一、问题探讨

单变量线性回归算法需要根据城市人口数量,预测开小吃店的利润
数据可以从Coursera中获得,第一列是城市人口数量,第二列是该城市小吃店利润。

二、代码解析

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

numpy库,pandas库和matplotlib库分别实现了python的线性代数,数据处理及画图功能,我们以后每次人工智能算法的实现都离不开这三个模块

2.读入数据

代码如下(示例):

path ='D:\machine learning data\ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])

read_csv中的参数header指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。

3.数据处理

代码如下(示例):

data.insert(0, 'Ones', 1)#在第0列插入一列,这列值全为1
clos=data.shape[1]  #shape[1]取列数,[0]取行数,clos=3
X=data.iloc[:,0:clos-1]#iloc,行全选,选01列,是前闭后开集合.X为DataFrame形式,既有行索引,也有列索引
y=data.iloc[:,clos-1:clos]#行全选,选最后一列
#print(X.head()) #验证X,y
#print(y.head())
X = np.matrix(X.values)#将X,y转化成矩阵
y = np.matrix(y.values)
theta=np.matrix([0,0]) #将theta转化成空矩阵j

注意在第0列一定要插入新的一列,这是和theta0联立的一列参数。如果没有这一列,建立的模型就只是经过原点的直线、平面等;同时matrix和array建立矩阵的不同在于:matrix只能建立一维矩阵,而array可以建立多维矩阵,但在numpy中matrix的主要优势是:相对简单的乘法运算符号。例如,a和b是两个matrices,那么a*b,就是矩阵积。而不用np.dot()

4.计算代价函数

代码如下(示例):

def computeCost(X, y, theta):#计算代价函数
    inner=np.power(((X*theta.T)-y),2)
    return np.sum(inner)/(2 * len(X))#len(X)为行数,即公式中的m
print(computeCost(X, y, theta))

在这里我们可以让电脑计算一下初始的cost,结果为32.072733877455676。同时需要注意的是theta.T表示对theta的转置,如果没有转置theta将无法得出正确结果

5.梯度下降算法计算最优解

代码如下(示例):

def gradientDescent(X, y, theta, alpha, iters):#alpha学习率,iters迭代次数
    temp = np.matrix(np.zeros(theta.shape))#一个与theta相同维度的0矩阵
    parameters=int(theta.ravel().shape[1]) #ravel()将多维降为一维
    cost = np.zeros(iters)#保存迭代之后的cost
    for i in range(iters):
        error=(X*theta.T)-y
        for j in range(parameters):
            term=np.multiply(error,X[:,j])
            temp[0,j]=theta[0,j] - np.sum(term)*(alpha/len(X))
        theta=temp
        cost[i]=computeCost(X, y, theta)
    return theta, cost
alpha = 0.01
iters= 1500
g,cost = gradientDescent(X, y, theta, alpha, iters)
print(g)
print(computeCost(X, y, g))#使用拟合值来计算代价函数(误差)

这里alpha和iters分别代表学习率和迭代次数。需要注意的是:np库中的multiply函数用于矩阵或数组对应位置相乘,不是传统意义上的矩阵相乘计算

6.画图

代码如下(示例):

x = np.linspace(data.Population.min(), data.Population.max(), 100) #横坐标在最大和最小之间分100份
f = g[0, 0] + (g[0, 1] * x)
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

在最后我们可以使用matplotlib.pyplot库进行画图操作。到这里如果能自己在无需他人辅助指导的情况下理解复写代码,则说明你已经基本完成作业要求了。

总结

由于自己只是大学大二小白一位,再加上自己是在宿舍自学机器学习算法,所以无法定期更新一篇文章,但后期我会尽我所能早日完成新的文章,在自己喜爱的领域越走越远!


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明吴恩达机器学习课程作业(一)基于python实现 详细解析
喜欢 (0)

您必须 登录 才能发表评论!

加载中……