机器学习准备---1、简单线性回归(最小二乘法实例)
机器学习准备---1、简单线性回归(最小二乘法实例)
打赏
一、总结
一句话总结:
1、在本例中,最小二乘法就是计算损失的,就是求出w和b之后计算这对w和b对应的损失(因为本例中w和b是用公式可以求的)
2、而在tensorflow2的例子中,因为w和b是多次试探,所以每次试探的结果就是使最小二乘法对应的损失函数最小
1、损失函数就是用最小二乘法来做的?
核心代码:total_cost += (y-w*x-b)**2
# 损失函数是系数的函数,另外还要传入数据的x,y def compute_cost(w,b,points): total_cost=0 M =len(points) for i in range(M): x=points.iloc[i,1] y=points.iloc[i,2] # y1=wx+b # 最小二乘法也就是求(y-y1)^2 total_cost += (y-w*x-b)**2 print("i={}, x={}, y={}, y-w*x-b={}, total_cost={}".format(i,x,y,y-w*x-b,total_cost)) return total_cost/M #一除都是浮点 两个除号是地板除,整型。 如 3 // 4
2、做拟合就是求出w和b,而w和b是有公式可以计算的?
核心代码:w = sum_yx/(sum_x2-M*(x_bar**2))
#定义核心拟合函数 # 也就是求w和b def fit1(points): M = len(points) x_bar=np.mean(points.iloc[:,1]) y_bar=np.mean(points.iloc[:,2]) # print("x_bar={}".format(x_bar)) sum_yx= 0 sum_x2=0 sum_delta =0 for i in range(M): x=points.iloc[i,1] y=points.iloc[i,2] sum_yx += y*x-x_bar*y_bar sum_x2 += x**2 #根据公式计算w w = sum_yx/(sum_x2-M*(x_bar**2)) # b的求法就是:b = 总误差 / 总样本数 for i in range(M): x=points.iloc[i,1] y=points.iloc[i,2] sum_delta += (y-w*x) b = sum_delta / M return w,b # 4.测试 points = data w,b =fit1(points) print ("w is :",w) print ("b is :",b)
二、简单线性回归(最小二乘法实例)
博客对应课程的视频位置:
# 0.引入依赖
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
# 1.导入数据
data = pd.read_csv('../dataset/income.csv')
data
Out[2]:
In [3]:
print(data.iloc[0,0])
print(data.iloc[1,1])
print(data.iloc[2,2])
print(len(data))
In [4]:
%matplotlib inline
plt.scatter(data.Education,data.Income)
Out[4]:
In [5]:
# 2.定义损失函数
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w,b,points):
total_cost=0
M =len(points)
for i in range(M):
x=points.iloc[i,1]
y=points.iloc[i,2]
# y1=wx+b
# 最小二乘法也就是求(y-y1)^2
total_cost += (y-w*x-b)**2
print("i={}, x={}, y={}, y-w*x-b={}, total_cost={}".format(i,x,y,y-w*x-b,total_cost))
return total_cost/M #一除都是浮点 两个除号是地板除,整型。 如 3 // 4
In [23]:
# 测试损失函数
compute_cost(1,1,data)
Out[23]:
用第二个公式求 b帽子
In [6]:
# 3.定义核心算法拟合函数
# 先定义一个求均值的函数 问题 求均值是不是可以直接用np.mean(data)来实现?
# def average(data):
# sum=0
# num=len(data)
# for i in range(num):
# sum += data[i]
# return sum/num
# print(average(x))
# print(np.mean(x))
#打印出来结果一样,可以通用。
#定义核心拟合函数
# 也就是求w和b
def fit(points):
M = len(points)
x_bar=np.mean(points.iloc[:,1])
# print("x_bar={}".format(x_bar))
sum_yx= 0
sum_x2=0
sum_delta =0
for i in range(M):
x=points.iloc[i,1]
y=points.iloc[i,2]
sum_yx += y*(x-x_bar)
# 与sum_yx += y*x-x_bar*y_bar 是一样的
# x_bar*y_bar=x_bar*n*(y1+y2+..+yn)/n=x_bar*yi
sum_x2 += x**2
#根据公式计算w
w = sum_yx/(sum_x2-M*(x_bar**2))
# b的求法就是:b = 总误差 / 总样本数
for i in range(M):
x=points.iloc[i,1]
y=points.iloc[i,2]
sum_delta += (y-w*x)
b = sum_delta / M
return w,b
In [7]:
#定义核心拟合函数
# 也就是求w和b
def fit1(points):
M = len(points)
x_bar=np.mean(points.iloc[:,1])
y_bar=np.mean(points.iloc[:,2])
# print("x_bar={}".format(x_bar))
sum_yx= 0
sum_x2=0
sum_delta =0
for i in range(M):
x=points.iloc[i,1]
y=points.iloc[i,2]
sum_yx += y*x-x_bar*y_bar
sum_x2 += x**2
#根据公式计算w
w = sum_yx/(sum_x2-M*(x_bar**2))
# b的求法就是:b = 总误差 / 总样本数
for i in range(M):
x=points.iloc[i,1]
y=points.iloc[i,2]
sum_delta += (y-w*x)
b = sum_delta / M
return w,b
# 4.测试
points = data
w,b =fit1(points)
print ("w is :",w)
print ("b is :",b)
In [8]:
# 4.测试
points = data
w,b =fit(points)
print ("w is :",w)
print ("b is :",b)
cost = compute_cost(w,b,points)
print("cost is :" ,cost)
In [26]:
x = data.Education
y = data.Income
plt.scatter(x,y)
pred_y= w*x+b
plt.plot(x,pred_y,c='r')
Out[26]:
为什么用tersorflow2做的线性回归的效果没有本例中的好
因为本例是使用公式直接计算的w和b,而tensorflow2中是一个值一个值的去找的
In [ ]:
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2025-01-31:宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步