python机器学习线性回归算法

1、线性回归:
(1)回归分析用来建立方程模拟两个或者多个变量之间如何关联;被用来预测的变量叫自变量,被预测的变量叫做因变量。如果包含两个以上的自变量,则称多元线性回归。

2、代价函数,相关系数/决定系数
(1)最小二乘法定义的代价函数:
真实值y,预测值𝜃(𝑥),则误差平方为(y − ℎ𝜃(𝑥))2
找到合适的参数,使得误差平方和最小:(注意这个函数是关于𝜃0,𝜃1的二元函数,因此问题即为求二元函数的全局最小值位置)
在这里插入图片描述
(2)相关系数:
我们使用相关系数去衡量线性相关性的强弱:
越接近-1,负相关性越强;越接近1,正相关性越强;0没有相关性
在这里插入图片描述
(3)决定系数:
相关系数𝑅2是用来描述两个变量之间的线性关系的,但决定系数的适用范围更广,可以用于描述非线性或者有两个及两个以上自变量的相关关系。它可以用来评价模型的效果。

3、梯度下降法求代价函数最小值及𝜃0,𝜃1
(1)基本原理:
初始化𝜃0,𝜃1,不断改变𝜃0,𝜃1,直到J(𝜃0,𝜃1)到达一个全局最小值,或者局部最小值。
以一元函数为例:
斜率为正往左走;斜率为负往右走

(2)伪代码表示:
在这里插入图片描述
注意,在更新𝜃0,𝜃1时,应该同步更新
在这里插入图片描述
(3)代价函数求导结果:
在这里插入图片描述
(4)代码缺陷:
i:可能陷入局部极小值,不过幸好该代价函数是一个凸函数,最小值唯一;
ii:由于学习率是一个离散值,因此经过若干次迭代后,其结果很有可能是一个十分接近最小值的结果,而和数学意义上的真正最小值有细微差别;当然学习率越小,也就越精确;

4、代码展示:
python机器学习线性回归算法 相关代码
my_first_regression.py:

import numpy as np
import matplotlib.pyplot as plt

#载入数据
#np.genfromtxt()的功能是从文本文件加载数据,按指定处理缺失值,并返回一个数组
#参数说明:
#fname:要读取的文件
#dtype: 结果数组的数据类型。 如果为None,则dtypes将由每列的内容单独确定
#delimiter: 用于分隔值的字符串。 默认情况下,任何连续的空格都用作分隔符。
#skip_header:要在文件开头跳过的行数。
#skip_footer:要在文件末尾跳过的行数。
#usecols:要读取哪些列,其中0为第一列。 例如,usecols =(1,4,5)将提取第2列,第5列和第6列。
data = np.genfromtxt("gradient-descent-data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data, y_data)
plt.show()

#学习率
lr = 0.0001
#初始截距
b = 0
#初始斜率
k = 0
#最大迭代次数
epochs = 50

#最小二乘法
 #计算代价函数的值
def compute_error(b, k, x_data, y_data):
    totalError = 0
    for i in range(0, len(x_data)):
        totalError += (y_data[i] - (k*x_data[i] + b))**2
    return totalError / float(len(x_data))

def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
    #计算总数据量
    m = float(len(x_data))
    #循环epochs次
    for i in range(epochs):
        #以下两个变量用于存储损失函数的梯度
        b_grad = 0
        k_grad = 0
        #计算该处损失函数的梯度
        for j in range(len(x_data)):
            b_grad += (1/m) * ((k * x_data[j] + b) - y_data[j])
            k_grad += (1/m)  * x_data[j] * ((k * x_data[j] + b) - y_data[j])
        #更新b和k 
        b = b - (lr * b_grad)
        k = k - (lr * k_grad)
        #每迭代5次,输出依次图像
        if i%5 == 0:
            print("epochs:",i)
            plt.scatter(x_data, y_data)
            plt.plot(x_data, k*x_data + b, "r")
            plt.show()
    return b,k

#输出
#print函数输出:
# 方案一:一个萝卜一个坑
# print('{0}+{1}={2}'.format(j,i,j+i));
# 方案二:类似于C语言格式输出
# print("%d + %d = %d" %(j,i,j+i));
#在%后面加的具体内容参见网页:https://zhuanlan.zhihu.com/p/141628158
print("Starting b = {0}, k = {1}, error = {2}".format(b,k,compute_error(b,k,x_data,y_data)))
b,k = gradient_descent_runner(x_data, y_data, b, k, lr, epochs)
print("After {0} iterations, b = {1}, k = {2}, error = {3}".format(epochs,b,k,compute_error(b,k,x_data,y_data)))

plt.plot(x_data, y_data, "b.")
plt.plot(x_data, k * x_data + b, "r")
plt.show()

wine.py:

import numpy as np
import matplotlib.pyplot as plt
#引入线性回归库
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

#载入数据
data = np.genfromtxt("gradient-descent-data.csv", delimiter=",")
x_data = data[1:,0]
y_data = data[1:,1]
plt.scatter(x_data, y_data)
plt.xlabel("Age")
plt.ylabel("Quality")
plt.title("Age Vs Quality")
plt.show()

#数据拆分
x_train, x_test, y_train, y_test = train_test_split(data[1:,0], data[1:,1], test_size=0.3)

#np.newaxis的功能是给数字增加一个维度因为训练模型的时候,函数要求传进去的是2维数据
#如例:
x1 = np.array([1, 2, 3, 4, 5])
# the shape of x1 is (5,)
x1_new = x1[:, np.newaxis]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])
x1_new = x1[np.newaxis,:]
# now, the shape of x1_new is (1, 5)
# array([[1, 2, 3, 4, 5]])
x_train = x_train[:, np.newaxis]
y_train = y_train[:, np.newaxis]

#训练模型
model = LinearRegression()
model.fit(x_train, y_train)

#训练集散点图
plt.scatter(x_train, y_train, color="b")
#预测结果
plt.plot(x_train, model.predict(x_train),color="r", linewidth=5)
#表格描述
plt.title("Age Vs Quality")
plt.xlabel("Age")
plt.ylabel("Quality")
plt.show()
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值