先贴1.0作业代码

题目:
在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。
x表示人口数据,y表示利润,一共97行数据。

数据链接: https://pan.baidu.com/s/1-u0iDFDibZc6tTGGx9_wnQ 提取码: 351j

注意:Python中可以用numpy的load函数读取数据,也可以用pandas的read函数读取,区别在于numpy读取的数据以array的形式而pandas以dataframe的形式,也就是在pandas中是matrix而不是array,但两者可以利用函数互相转化。
dataframe的优势是可以对数据进行很多操作,例如缺失值处理、合并或截取数据等。但是要想进行矩阵运算,先需要把dataframe转化为矩阵,例如x = x.values,再进行运算。但在array中就可以直接操作,注意这里的乘法和array通用,也是.dot()或者@。

import numpy as np
import matplotlib.pyplot as plt


def compute_cost(X, Y, theta):
    # 两个数组作矩阵乘积
    # 当两个数组的维度不能直接进行矩阵乘法时,dot会把后面的参数进行转置
    hypthesis = np.dot(X, np.transpose(theta))
    # 先转置再做矩阵乘法
    cost = np.dot(np.transpose(hypthesis - Y), (hypthesis - Y))
    cost = cost / (2 * X.shape[0])
    return cost


def gradient_descent(X, Y, theta_init, alpha, iter_num):
    # 样本个数
    m = Y.shape[0]
    # 代价的历史值
    J_history = np.zeros(iter_num)
    theta = theta_init
    # 进行迭代计算
    for num in range(0, iter_num):
        # 计算每一个theta值下的代价值
        J_history[num] = compute_cost(X, Y, theta)
        # 根据公式计算梯度,来更新theta的值
        hyp = np.dot(X, np.transpose(theta))
        theta = theta - alpha * np.dot(np.transpose(hyp - Y), X) / m
    return theta, J_history



# ======== 1.载入数据和绘制散点图 ========
print('读取数据,并绘制散点图...\n')
filepath = r'ex1data1.txt'
# 从文件中读取数据,读取第0列和第1列,要求文件中每一行的列数相等
dataset = np.loadtxt(filepath,
                     delimiter=',',
                     usecols=(0, 1))  # 分隔符 读取第一列和第二列
Xdata = dataset[:, 0]
Ydata = dataset[:, 1]

# ======== 2.计算代价和梯度 ========
print('进行梯度计算...\n')
# 按照第二维度,把两个数组连接起来
# 给输入数据增加一个偏置维度
X = np.c_[np.ones(Xdata.shape[0]), Xdata]
Y = Ydata
# 初始化参数:theta,iter_num,alpha
theta_init = np.zeros(X.shape[1])

iter_num = 1500
alpha = 0.01
# 计算初始代价
print('Initial cost:',
      str(compute_cost(X, Y, theta_init)),
      '\nThis value should be 32.07')
# 使用梯度下降法进行优化求解
theta_fin, J_history = gradient_descent(X, Y, theta_init, alpha, iter_num)
print('Theta found by gradient descent:', str(theta_fin.reshape(2)))
# 绘制数据散点图和线性回归曲线
plt.figure(0)  # 设置图像编号为0
plt.scatter(Xdata, Ydata, c='red', marker='x', s=20)  # 设置图像的参数
plt.plot(X[:, 1], np.dot(X, np.transpose(theta_fin)), 'b-', lw=3)
plt.xlabel('Population of City in 10,000s', fontsize=10)
plt.ylabel('Profit of City in $10,000', fontsize=10)
plt.legend(['Data Point', 'Linear Regression'])
plt.show()

再贴1.1代码

题目:在本部分的练习中,需要预测房价,输入变量有两个特征,一是房子的面积,二是房子卧室的数量;输出变量是房子的价格。
数据链接: https://pan.baidu.com/s/1-u0iDFDibZc6tTGGx9_wnQ
提取码: 351j

import numpy as np
import matplotlib.pyplot as plt

def feature_normalize(Xdata):
    # 计算每一维度的均值
	X_mean = np.mean(Xdata,axis=0)
	X_std = np.std(Xdata,axis=0)
	X_norm = np.divide(np.subtract(Xdata,X_mean),X_std)

	return X_norm,X_mean,X_std

def compute_cost(X, Y, theta):
    # 两个数组作矩阵乘积
    # 当两个数组的维度不能直接进行矩阵乘法时,dot会把后面的参数进行转置
    hypthesis = np.dot(X, np.transpose(theta))
    # 先转置再做矩阵乘法
    cost = np.dot(np.transpose(hypthesis - Y), (hypthesis - Y))
    cost = cost / (2 * X.shape[0])
    return cost


def gradient_descent(X, Y, theta_init, alpha, iter_num):
    # 样本个数
    m = Y.shape[0]
    # 代价的历史值
    J_history = np.zeros(iter_num)
    theta = theta_init
    # 进行迭代计算
    for num in range(0, iter_num):
        # 计算每一个theta值下的代价值
        J_history[num] = compute_cost(X, Y, theta)
        # 根据公式计算梯度,来更新theta的值
        hyp = np.dot(X, np.transpose(theta))
        theta = theta - alpha * np.dot(np.transpose(hyp - Y), X) / m
    return theta, J_history

# ======== 1.读取数据并标准化数据的特征 ========
data = np.loadtxt(r'ex1data2.txt',delimiter =',')
Xdata = data[:,0:2]
Ydata = data[:,2]
# 对输入数据特征进行标准化
X,mu,sigma = feature_normalize(Xdata)
# print('Mu is:',mu)
# print('Sigma is:',sigma)
X = np.c_[np.ones(X.shape[0]),X]
Y = Ydata

# ======== 2.使用梯度下降法求解 ========
theta_init = np.zeros(X.shape[1])
alpha = 0.05
num_iters = 300

theta,J_history = gradient_descent(X,Y,theta_init,alpha,num_iters)
plt.figure()
plt.plot(np.arange(J_history.size),J_history)
plt.xlabel('Number of iterations')
plt.ylabel('Cost J')
#plt.axis([0,num_iters,0,100])
plt.show()
# theta是数组格式,格式化输出时,不能像下面那样{:0.3f}
print('Theta computed from gradient descent : \n{}'.format(theta))

# ======== 3.预测 ========
Xtest = np.array([1,1650,3])
price = np.dot(Xtest,np.transpose(theta))
print('Predicted price of a 1650 sq-ft, 3 br house (using normal equations) : {:0.3f}'.format(price))

一、什么是机器学习

参考吴恩达机器学习视频: 1 - 2 - What is Machine Learning_ (7 min).mkv

我觉得你们都来看博客的笔记了,肯定知道什么是机器学习了,我在这就不做机器学习定义的总结了(其实是本人很low,总结的不好)。

监督学习

参考吴恩达机器学习视频: 1 - 3 - Supervised Learning (12 min).mkv

监督学习指的就是我们给学习算法一个数据集。这个数据集由“正确答案”组成。在房价的例子中,我们给了一系列房子的数据,我们给定数据集中每个样本的正确价格,即它们实际的售价然后运用学习算法,算出更多的正确答案。比如你朋友那个新房子的价格。用术语来讲,这叫做回归问题。我们试着推测出一个连续值的结果,即房子的价格。

还有一种监督学习的问题是分类问题,比如说我有5个良性肿瘤样本,在1的位置有5个恶性肿瘤样本。现在我们有一个朋友很不幸检查出乳腺肿瘤。假设说她的肿瘤大概这么大,那么机器学习的问题就在于,你能否估算出肿瘤是恶性的或是良性的概率。用术语来讲,这是一个分类问题

可以看出回归问题和分类问题可以归为监督学习,因为他们都是基于已经做好标签的数据集。

现在来个小测验:假设你经营着一家公司,你想开发学习算法来处理这两个问题:

你有一大批同样的货物,想象一下,你有上千件一模一样的货物等待出售,这时你想预测接下来的三个月能卖多少件?
你有许多客户,这时你想写一个软件来检验每一个用户的账户。对于每一个账户,你要判断它们是否曾经被盗过?
那这两个问题,它们属于分类问题、还是回归问题?

1.问题一是一个回归问题,因为你知道,如果我有数千件货物,我会把它看成一个实数,一个连续的值。因此卖出的物品数,也是一个连续的值。

2.问题二是一个分类问题,因为我会把预测的值,用 0 来表示账户未被盗,用 1 表示账户曾经被盗过。所以我们根据账号是否被盗过,把它们定为0 或 1,然后用算法推测一个账号是 0 还是 1,因为只有少数的离散值,所以我把它归为分类问题。

以上就是监督学习的内容。

非监督学习

参考吴恩达机器学习视频: 1 - 4 - Unsupervised Learning (14 min).mkv
下面来介绍非监督学习
在这里插入图片描述
在这里插入图片描述

上个视频中,已经介绍了监督学习。回想当时的数据集,如图表所示,在这个数据集中每条数据都已经标明是阴性或阳性,即是良性或恶性肿瘤。所以,对于监督学习里的每条数据,我们已经清楚地知道,训练集对应的正确答案,是良性或恶性了。

在无监督学习中,我们已知的数据。看上去有点不一样,不同于监督学习的数据的样子,即无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。所以我们已知数据集,却不知如何处理,也未告知每个数据点是什么。别的都不知道,就是一个数据集。你能从数据中找到某种结构吗?针对数据集,无监督学习就能判断出数据有两个不同的聚集簇。这是一个,那是另一个,二者不同。是的,无监督学习算法可能会把这些数据分成两个不同的簇。所以叫做聚类算法。事实证明,它能被用在很多地方。

聚类应用的一个例子就是在谷歌新闻中。如果你以前从来没见过它,你可以到这个URL网址http://news.google.com去看看。谷歌新闻每天都在,收集非常多,非常多的网络的新闻内容。它再将这些新闻分组,组成有关联的新闻。所以谷歌新闻做的就是搜索非常多的新闻事件,自动地把它们聚类到一起。所以,这些新闻事件全是同一主题的,所以显示到一起。

事实证明,聚类算法和无监督学习算法同样还用在很多其它的问题上。

我们介绍了无监督学习,它是学习策略,交给算法大量的数据,并让算法为我们从数据中找出某种结构。

总结监督学习和非监督学习

好的,希望你们还记得垃圾邮件问题。如果你有标记好的数据,区别好是垃圾还是非垃圾邮件,我们把这个当作监督学习问题。

新闻事件分类的例子,就是那个谷歌新闻的例子,我们在本视频中有见到了,我们看到,可以用一个聚类算法来聚类这些文章到一起,所以是无监督学习。

细分市场的例子,我在更早一点的时间讲过,你可以当作无监督学习问题,因为我只是拿到算法数据,再让算法去自动地发现细分市场。

最后一个例子,糖尿病,这个其实就像是我们的乳腺癌,上个视频里的。只是替换了好、坏肿瘤,良性、恶性肿瘤,我们改用糖尿病或没病。所以我们把这个当作监督学习,我们能够解决它,作为一个监督学习问题,就像我们在乳腺癌数据中做的一样。

二、单变量线性回归(Linear Regression with One Variable)

下面是一些机器学习常见的算法

模型选择

参考吴恩达机器学习视频: 2 - 1 - Model Representation (8 min).mkv

我们的第一个学习算法是线性回归算法。在这段视频中,你会看到这个算法的概况,更重要的是你将会了解监督学习过程完整的流程。

让我们通过一个例子来开始:这个例子是预测住房价格的,我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。这就是监督学习算法的一个例子。
在这里插入图片描述
它被称作监督学习是因为对于每个数据来说,我们给出了“正确的答案”,即告诉我们:根据我们的数据来说,房子实际的价格是多少,而且,更具体来说,这是一个回归问题。回归一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格,同时,还有另一种最常见的监督学习方式,叫做分类问题,当我们想要预测离散的输出值,例如,我们正在寻找癌症肿瘤,并想要确定肿瘤是良性的还是恶性的,这就是0/1离散输出的问题。更进一步来说,在监督学习中我们有一个数据集,这个数据集被称训练集。

我将在整个课程中用小写的[公式]来表示训练样本的数目。

以之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示:
在这里插入图片描述
我们将要用来描述这个回归问题的标记如下:

代表训练集中实例的数量

x 代表特征/输入变量

y 代表目标变量/输出变量

(x,y) 代表训练集中的样本

(Xi,Yi) 代表第 [公式] 个观察实例

h 代表学习算法的解决方案或函数也称为假设(hypothesis)
在这里插入图片描述

代价函数

参考吴恩达机器学习视频: 2 - 2 - Cost Function (8 min).mkv
            2 - 3 - Cost Function - Intuition I (11 min).mkv

对于一次线性方程
在这里插入图片描述
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数
**加粗样式**
代价函数也被称作平方误差函数,有时也被称为平方误差代价函数。我们之所以要求出误差的平方和,是因为误差平方代价函数,对于大多数问题,特别是回归问题,都是一个合理的选择。还有其他的代价函数也能很好地发挥作用,但是平方误差代价函数可能是解决回归问题最常用的手段了。

在后续课程中,我们还会谈论其他的代价函数,但我们刚刚讲的选择是对于大多数线性回归问题非常合理的。

代价函数直观理解

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
代价函数的样子,等高线图,则可以看出在三维空间中存在一个使得代价函数最小的点。
在这里插入图片描述
当然,我们真正需要的是一种有效的算法,能够自动地找出这些使代价函数 J 取最小值的参数在这里插入图片描述在这里插入图片描述来。
下面我们将介绍一种算法,能够自动地找出能使代价函数最小化的参数和 的值。

梯度下降算法

参考吴恩达机器学习视频: 2 - 5 - Gradient Descent (11 min).mkv
            2 - 6 - Gradient Descent Intuition (12 min).mkv

梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是:开始时我们随机选择一个参数的组合 在这里插入图片描述,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。
在这里插入图片描述
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。批量梯度下降(batch gradient descent)算法的公式为:

在这里插入图片描述
在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数
批量梯度下降指的是在梯度下降的每一步中,我们都用到了所有的训练样本,在梯度下降中,在计算微分求导项时,我们需要进行求和运算,所以,在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有个训练样本求和。因此,批量梯度下降法这个名字说明了我们需要考虑所有这一"批"训练样本。
而事实上,有时也有其他类型的梯度下降法,不是这种"批量"型的,不考虑整个的训练集,而是每次只关注训练集中的一些小的子集。在后面的课程中,我们也将介绍这些方法。
-------------------------------------------
注意注意(下面写的这一点更新参数很重要)!!!

在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新 [公式][公式] ,当 在这里插入图片描述在这里插入图片描述时,会产生更新,所以你将更新 [公式][公式] 。实现梯度下降算法的微妙之处是,在这个表达式中,如果你要更新这个等式,你需要同时更新[公式] 和 [公式],我的意思是在这个等式中,我们要这样更新: [公式] ,并更新[公式] 。 实现方法是:你应该计算公式右边的部分,通过那一部分计算出[公式][公式]的值,然后同时更新在这里插入图片描述在这里插入图片描述。让我进一步阐述这个过程:

在这里插入图片描述
在梯度下降算法中,这是正确实现同时更新的方法。我不打算解释为什么你需要同时更新,同时更新是梯度下降中的一种常用方法。我们之后会讲到,同步更新是更自然的实现方法。当人们谈到梯度下降时,他们的意思就是同步更新。 在接下来的视频中,我们要进入这个微分项的细节之中。我已经写了出来但没有真正定义,如果你已经修过微积分课程,如果你熟悉偏导数和导数,这其实就是这个微分项:

在这里插入图片描述在这里插入图片描述

梯度下降算法如下:

描述:对在这里插入图片描述值,使得 J 按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中a是学习率(learning rate),它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。

在这里插入图片描述
让我们来看看a如果太小或太大会出现什么情况:

如果 [公式] 太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果 [公式] 太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。 如果 [公式] 太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果 [公式] 太大,它会导致无法收敛,甚至发散。 现在,我还有一个问题,当我第一次学习这个地方时,我花了很长一段时间才理解这个问题,如果我们预先把 [公式] 放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?

假设你将[公式]初始化在局部最低点,在这儿,它已经在一个局部的最优处或局部最低点。结果是局部最优点的导数将等于零,因为它是那条切线的斜率。这意味着你已经在局部最优点,它使得[公式]不再改变,也就是新的[公式]等于原来的[公式],因此,如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这也解释了为什么即使学习速率 [公式] 保持不变时,梯度下降也可以收敛到局部最低点。

梯度下降的线性回归

参考吴恩达机器学习视频: 2 - 7 - GradientDescentForLinearRegression (6 min).mkv

在以前的视频中我们谈到关于梯度下降算法,梯度下降是很常用的算法,它不仅被用在线性回归上和线性回归模型、平方误差代价函数。在这段视频中,我们要将梯度下降和代价函数结合。我们将用到此算法,并将其应用于具体的拟合直线的线性回归算法里。

梯度下降算法和线性回归算法比较如图:

在这里插入图片描述
对我们之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:
在这里插入图片描述

则算法改写成:
在这里插入图片描述
在这里插入图片描述

三、多变量线性回归(Linear Regression with Multiple Variables)

参考吴恩达机器学习视频: 4 - 1 - Multiple Features (8 min).mkv
所谓多变量就是X特征不止一个,在上面单变量线性回归中X特征只有一个,故方程为在这里插入图片描述而多变量线性回归中我们的线性方程可能就不是直线了,通式是
在这里插入图片描述

多变量梯度下降

方法与上面单变量梯度下降方法一样
在这里插入图片描述
其中:在这里插入图片描述

我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。 多变量线性回归的批量梯度下降算法为:
在这里插入图片描述
求导数后得到:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐