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()