记录一下自己深度学习的开始2020.12.08,以后坚持每天都写一点自己学习心得
回归:根据输入的数据,预测出某个具体的值
h(x)就是预测的值,也可以写作y^
因此,为了找到合适的权重(theta),数学上有很多找到其值的方法,在机器学习和数据分析中,我们常用的方法有四种
- 线性回归
- 多项式回归
- 岭回归
- LASSO
代价函数(损失函数)
在学习各类回归方法之前,必须有必要先了解代价函数
损失函数是由似然函数推导可得,而似然函数是指什么样的参数和我们的数据集组合敲好是真实值
似然函数化解后打开,会得到两个项,左边项都是常量,因此我们只要考虑右边项,而右边项是负数,所以当右边项越小时,权重越接近真实值,因此我们将右边的项叫最小二乘法
图为线性回归的损失值
通过上面的介绍,大概了解到损失值是获得的权重与期望的权重差值,我们当然希望这个差值越小越好,所以用上求导的方法找到当损失值最小的时候,权重为多少,这样就可以获得相对正确的数据
图为一元线性回归损失值求导
线性回归
根据x,y(输出集和结果集)对输入的值进行预测,找到一条近似的值
这里是高中知识了,不做过多概述
代码实现:
import numpy as np
import matplotlib.pyplot as plt
import time
#读取csv
csv_data=np.loadtxt(r"./data.csv",delimiter=",",dtype=float)
# print(csv_data)
#创建x和y
x=csv_data[:,0]
y=csv_data[:,1]
print(x)
print(y)
#画出散点图
# plt.scatter(x,y)
# plt.show()
#设置学习率
a=0.0001
#设置迭代次数
index=50
#初始化截距theta0
theta0=0
#初始化斜率theta1
theta1=0
#损失函数
def cost(x,y,theta0,theta1):
result=0
for i in range(len(x)):
result+=(y[i]-(theta1*x[i]+theta0))**2
return result/len(x)/2.0
# print(cost(x,y,theta0,theta1))
#梯度下降法
def gradient_descent_runner(x,y,a,index,theta0,theta1):
m=len(x)
for i in range(index):
theta0_demo=0
theta1_demo=0
# #视频给的代码:
# for j in range(0,len(x)):
# theta0_demo+=(1/m)*((theta1*x[j]+theta0)-y[j])
# theta1_demo+=(1/m)*((theta1*x[j]+theta0)-y[j])*x[j]
# theta0=theta0-(theta0_demo*a)
# theta1 =theta1 - (theta1_demo * a)
for j in range(len(x)):
theta0_demo+=(1/m)*((theta1*x[j]+theta0)-y[j])
theta1_demo+=(1/m)*((theta1*x[j]+theta0)-y[j])*x[j]
# #更新数据
theta0=theta0-(theta0_demo * a)
theta1=theta1-(theta1_demo*a)
#每下降5次画一次图
# if i%5==0:
# time.sleep(1)
# plt.title(i)
# plt.scatter(x,y)
# plt.plot(x,x*theta1+theta0,color="Orange")
# plt.show()
return theta0,theta1
# print(gradient_descent_runner(x,y,a,index,theta0,theta1))
#打印结果
print(f"原斜率k={theta1},b={theta0},损失值={cost(x,y,theta0,theta1)}")
print("Running...")
theta0,theta1=gradient_descent_runner(x,y,a,index,theta0,theta1)
print(f"得到的回归直线方程中,k={theta1},b={theta0},error={cost(x,y,theta0,theta1)}")
plt.scatter(x,y)
plt.plot(x,x*theta1+theta0,color="red")
plt.show()