python实现多变量线性回归(Linear Regression with Multiple Variables)

本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记

现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,...,xn)

表示为:

引入 x0=1,则公式 转化为:

1、加载训练数据

数据格式为:

X1,X2,Y

2104,3,399900

1600,3,329900

2400,3,369000

1416,2,232000

将数据逐行读取,用逗号切分,并放入np.array

#加载数据

#加载数据
def load_exdata(filename):
    data = []
    with open(filename, 'r') as f:
        for line in f.readlines(): 
            line = line.split(',')
            current = [int(item) for item in line]
            #5.5277,9.1302
            data.append(current)
    return data

data = load_exdata('ex1data2.txt');
data = np.array(data,np.int64)

x = data[:,(0,1)].reshape((-1,2))
y = data[:,2].reshape((-1,1))
m = y.shape[0]

# Print out some data points
print('First 10 examples from the dataset: \n')
print(' x = ',x[range(10),:],'\ny=',y[range(10),:])

First 10 examples from the dataset:

x = [[2104 3]

[1600 3]

[2400 3]

[1416 2]

[3000 4]

[1985 4]

[1534 3]

[1427 3]

[1380 3]

[1494 3]]

y= [[399900]

[329900]

[369000]

[232000]

[539900]

[299900]

[314900]

[198999]

[212000]

[242500]]

2、通过梯度下降求解theta

 (1)在多维特征问题的时候,要保证特征具有相近的尺度,这将帮助梯度下降算法更快地收敛。

解决的方法是尝试将所有特征的尺度都尽量缩放到-1 到 1 之间,最简单的方法就是(X - mu) / sigma,其中mu是平均值, sigma 是标准差。

(2)损失函数和单变量一样,依然计算损失平方和均值

我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。多变量线性回归的批量梯度下降算法为:

求导数后得到:

(3)向量化计算

向量化计算可以加快计算速度,怎么转化为向量化计算呢?

在多变量情况下,损失函数可以写为:

对theta求导后得到:

(1/2*m) * (X.T.dot(X.dot(theta) - y))

因此,theta迭代公式为:

theta = theta - (alpha/m) * (X.T.dot(X.dot(theta) - y))

(4)完整代码如下:

#特征缩放
def featureNormalize(X):
    X_norm = X;
    mu = np.zeros((1,X.shape[1]))
    sigma = np.zeros((1,X.shape[1]))
    for i in range(X.shape[1]):
        mu[0,i] = np.mean(X[:,i]) # 均值
        sigma[0,i] = np.std(X[:,i])     # 标准差
#     print(mu)
#     print(sigma)
    X_norm  = (X - mu) / sigma
    return X_norm,mu,sigma

#计算损失
def computeCost(X, y, theta):
    m = y.shape[0]
#     J = (np.sum((X.dot(theta) - y)**2)) / (2*m) 
    C = X.dot(theta) - y
    J2 = (C.T.dot(C))/ (2*m)
    return J2

#梯度下降
def gradientDescent(X, y, theta, alpha, num_iters):
    m = y.shape[0]
    #print(m)
    # 存储历史误差
    J_history = np.zeros((num_iters, 1))
    for iter in range(num_iters):
        # 对J求导,得到 alpha/m * (WX - Y)*x(i), (3,m)*(m,1)  X (m,3)*(3,1) = (m,1)
        theta = theta - (alpha/m) * (X.T.dot(X.dot(theta) - y))
        J_history[iter] = computeCost(X, y, theta)
    return J_history,theta
    

iterations = 10000  #迭代次数
alpha = 0.01    #学习率
x = data[:,(0,1)].reshape((-1,2))
y = data[:,2].reshape((-1,1))
m = y.shape[0]
x,mu,sigma = featureNormalize(x)
X = np.hstack([x,np.ones((x.shape[0], 1))])
# X = X[range(2),:]
# y = y[range(2),:]

theta = np.zeros((3, 1))

j = computeCost(X,y,theta)
J_history,theta = gradientDescent(X, y, theta, alpha, iterations)


print('Theta found by gradient descent',theta)

Theta found by gradient descent [[ 109447.79646964]

[ -6578.35485416]

[ 340412.65957447]]

绘制迭代收敛图

plt.plot(J_history)

plt.ylabel('lost');

plt.xlabel('iter count')

plt.title('convergence graph')

使用模型预测结果

def predict(data):
    testx = np.array(data)
    testx = ((testx - mu) / sigma)
    testx = np.hstack([testx,np.ones((testx.shape[0], 1))])
    price = testx.dot(theta)
    print('price is %d ' % (price))

predict([1650,3])

price is 293081

no bb,上代码,代码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法全栈工程师

基础|认识机器学习中的逻辑回归、决策树、神经网络算法

逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,因此我们设计出了逻辑回归这样一个算法,它的输...

802
来自专栏PPV课数据科学社区

机器学习系列:(十)从感知器到人工神经网络

从感知器到人工神经网络 在第8章,感知器里,我们介绍了感知器,一种线性模型用来做二元分类。感知器不是一个通用函数近似器;它的决策边界必须是一个超平面。上一章里面...

2779
来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触 第四章:单层神经网络

在前言中,已经提到经常使用深度学习的领域就是模式识别。编程初学者都是从打印“Hello World”开始,深度学习中我们则是从识别手写数字开始。 本章中,我会讲...

37211
来自专栏机器学习算法全栈工程师

基础|认识机器学习中的逻辑回归、决策树、神经网络算法

作者:石文华 编辑:田 旭 逻辑回归 1 逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,...

3518
来自专栏WD学习记录

机器学习 学习笔记(24) 序列建模:循环和递归网络

循环神经网络(recurrent nerual network)或RNN是一类用于处理序列数据的神经网络,就像卷积网络是专门用于处理网格化数据X的神经网络。循环...

1271
来自专栏数据科学学习手札

(数据科学学习手札26)随机森林分类器原理详解&Python与R实现

一、简介   作为集成学习中非常著名的方法,随机森林被誉为“代表集成学习技术水平的方法”,由于其简单、容易实现、计算开销小,使得它在现实任务中得到广泛使用,因为...

3507
来自专栏决胜机器学习

循环神经网络(一) ——循环神经网络模型与反向传播算法

循环神经网络(一) ——循环神经网络模型与反向传播算法 (原创内容,转载请注明来源,谢谢) 一、概述 这一章开始讲循环神经网络(RNN,Recurrent Ne...

3475
来自专栏机器之心

入门 | 无需双语语料库的无监督式机器翻译

3337
来自专栏计算机视觉战队

前馈神经网络和BP算法简单教程

吴立德老师亲自讲解前馈神经网络和BP算法,让初学者对基础更加了解,对以后网络的改建和创新打下基础,值得好好学习!希望让很多关注的朋友学习更多的基础知识,打下牢固...

3186
来自专栏人工智能LeadAI

《机器学习基石》课程学习总结(三)

前面两篇文章要点回顾: 第一篇:机器学习的主要任务是用算法A,利用数据集D从假设集H中挑出一个函数g,使得E_in(g)最小。 第二篇:可以证明,当假设集H...

3905

扫码关注云+社区