导包

import numpy as npimport matplotlib.pyplot as plt
%matplotlib inlinefrom sklearn.linear_model import LinearRegression

创建数据

X = np.linspace(2,10,20).reshape(-1,1)# f(x) = wx + b
y = np.random.randint(1,6,size = 1)*X + np.random.randint(-5,5,size = 1)# 噪声,加盐
y += np.random.randn(20,1)*0.8plt.scatter(X,y,color =  'red')

使用已有的线性回归拟合函数

lr = LinearRegression()
lr.fit(X,y)w = lr.coef_[0,0]
b = lr.intercept_[0]
print(w,b)plt.scatter(X,y)x = np.linspace(1,11,50)plt.plot(x,w*x + b,color = 'green')

1.965481199093173 -4.644495936205775

自己实现了线性回归(简版)

# 使用梯度下降解决一元一次的线性问题:w,b
class LinearModel(object):def __init__(self):self.w = np.random.randn(1)[0]self.b = np.random.randn(1)[0]
#     数学建模:将数据X和目标值关系用数学公式表达def model(self,x):#model 模型,f(x) = wx + breturn self.w*x + self.bdef loss(self,x,y):#最小二乘得到缺失值cost = (y - self.model(x))**2
#         梯度就是偏导数,求解两个未知数:w,bgradient_w = 2*(y - self.model(x))*(-x)gradient_b = 2*(y - self.model(x))*(-1)return cost,gradient_w,gradient_b
#     梯度下降def gradient_descent(self,gradient_w,gradient_b,learning_rate = 0.1):
#         更新w,bself.w -= gradient_w*learning_rateself.b -= gradient_b*learning_rate
#     训练fitdef fit(self,X,y):count = 0 #算法执行优化了3000次,退出tol = 0.0001last_w = self.w + 0.1last_b = self.b + 0.1length = len(X)while True:if count > 3000:#执行的次数到了break
#           求解的斜率和截距的精确度达到要求if (abs(last_w - self.w) < tol) and (abs(last_b - self.b) < tol):breakcost = 0gradient_w = 0gradient_b = 0for i in range(length):cost_,gradient_w_,gradient_b_ = self.loss(X[i,0],y[i,0])cost += cost_/lengthgradient_w += gradient_w_/lengthgradient_b += gradient_b_/length
#             print('---------------------执行次数:%d。损失值是:%0.2f'%(count,cost))last_w = self.wlast_b = self.b# 更新截距和斜率self.gradient_descent(gradient_w,gradient_b,0.01)count+=1def result(self):return self.w,self.b
取值的时候X 是二维的所以 取出X,y数据中的第一个数
self.loss(X[i,0],y[i,0])

使用自己实现的线性回归拟合函数

lm = LinearModel()lm.fit(X,y)w_,b_ = lm.result()plt.scatter(X,y,c = 'red')plt.plot(x,1.9649*x - 4.64088,color = 'green')plt.plot(x,w*x + b,color = 'blue')plt.title('自定义的算法拟合曲线',fontproperties = 'KaiTi')

Text(0.5, 1.0, ‘自定义的算法拟合曲线’)

多元的线性回归

import numpy as npimport matplotlib.pyplot as plt
%matplotlib inlinefrom sklearn.linear_model import LinearRegression

其实相似

# 一元二次
# f(x) = w1*x**2 + w2*x + b# 二元一次
# f(x1,x2) = w1*x1 + w2*x2 + bX = np.linspace(0,10,num = 500).reshape(-1,1)X = np.concatenate([X**2,X],axis = 1)
X.shape

(500, 2)

w = np.random.randint(1,10,size = 2)
b = np.random.randint(-5,5,size = 1)
# 矩阵乘法
y = X.dot(w) + b
plt.plot(X[:,1],y,color = 'r')plt.title('w1:%d.w2:%d.b:%d'%(w[0],w[1],b[0]))

Text(0.5, 1.0, ‘w1:1.w2:1.b:4’)

使用sklearn自带的算法,预测

lr = LinearRegression()lr.fit(X,y)print(lr.coef_,lr.intercept_)plt.scatter(X[:,1],y,marker = '*')x = np.linspace(-2,12,100)plt.plot(x,1*x**2 + 6*x + 1,color = 'green')


[1. 1.] 3.999999999999993

自己手写的线性回归,拟合多属性,多元方程

# epoch 训练的次数,梯度下降训练多少
def gradient_descent(X,y,lr,epoch,w,b):
#     一批量多少,长度batch = len(X)for i in range(epoch):
#         d_loss:是损失的梯度d_loss = 0
#         梯度,斜率梯度dw = [0 for _ in range(len(w))]
#        截距梯度db = 0for j in range(batch):y_ = 0 #预测的值 预测方程 y_ = f(x) = w1*x1 + w2*x2 + b#求预测值y_,分开了 先*w 再加bfor n in range(len(w)):y_ += X[j][n]*w[n]y_ += b#再利用最小二乘法 求导 得出损失值 再求导得到梯度 d_loss #再将梯度求导 y_ = f(x) = w1*x1 + w2*x2 + b 来对w1求导结果为就为 X[j][n] 再乘 d_loss 求dw的值 可能有点乱。#db 一样 根据b来对y_ 求导得1
#            平方中求导两种情况相同 ,
#             (y - y_)**2 -----> 2*(y-y_)*(-1)
#             (y_- y)**2  -----> 2*(y_ - y)*(1)d_loss = -(y[j] - y_)#再求w的梯度  就是对y[j]求导 这个系数2 不影响结果#结果为 w1' =  X[j][n]*d_loss#cost = (y - (w1*X[j][0] + w2*X[j][1] +…… + b)**2          #w1梯度,导数# -2*(y - y_) * X[j][0]for n in range(len(w)):dw[n] += X[j][n]*d_loss/float(batch)db += 1*d_loss/float(batch)
#         更新一下系数和截距,梯度下降for n in range(len(w)):w[n] -= dw[n]*lr[n]b -= db*lr[0]return w,b
lr = [0.0001,0.0001]
w = np.random.randn(2)
b = np.random.randn(1)[0]
w_,b_ = gradient_descent(X,y,lr,5000,w,b)
print(w_,b_)

[1.00325157 1.22027686] 2.1550745865631895

plt.scatter(X[:,1],y,marker = '*')x = np.linspace(-2,12,100)f = lambda x:w_[0]*x**2 + w_[1]*x + b_plt.plot(x,f(x),color = 'green')

【机器学习】自己手写实现线性回归,梯度下降 原理相关推荐

  1. 【python机器学习】线性回归--梯度下降实现(基于波士顿房价数据集)

    波士顿房价数据集字段说明 crim 房屋所在镇的犯罪率 zn 面积大于25000平凡英尺住宅所占比例 indus 房屋所在镇非零售区域所占比例 chas 房屋是否位于河边 如果在河边,值1 nox 一 ...

  2. 线性回归—梯度下降python实现

    import numpy as np import pandas as pd 导入数据 data=pd.read_csv(r"F:\数据集\dataset\boston.csv") ...

  3. 机器学习:手写数字识别(Hand-written digits recognition)小项目

    该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~ 地址:Machine-Learning/machine-learning-ex3/ 1. Introduction 手写数字识别( ...

  4. 【机器学习】手写识别系统

    [机器学习]手写识别系统 过程 ==准备数据:将图像转换为测试向量== ==测试算法:使用k-近邻算法识别手写数字== ==完整代码== 过程 收集数据:提供文本文件 准备数据:编写函数classif ...

  5. 线性回归梯度下降py实现

    线性回归梯度下降Python实现 在命令行使用此代码运行 python filename.py learning_rate 不设置 l e a r n i n g _ r a t e learning ...

  6. 机器学习:线性回归梯度下降预测波士顿房价

    线性回归 分类: 目标值离散 回归: 目标值连续 线性回归:寻找一种能预测的趋势 线性关系:-二维:直线关系-三维:平面 线性关系定义 y=kx+by = kx + by=kx+b 参数b,偏置项,为 ...

  7. 【机器学习】手写数字识别学习笔记(对三篇文件进行分析记录)

    看了许多网站,涉及的知识也非常多(毕竟是机器学习"第一题"),真正能理解并掌握,或者说记住的内容,并不多. 一.分类-MNIST(手写数字识别) 1.数据集:博客的网盘链接中50多 ...

  8. 梯度下降原理及在线性回归、逻辑回归中的应用

    1 基本概念 1)定义 梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代能使待优化的目标函数逐步减小. 梯度下降法是2范数下的最速下降法. 最速下降法的一种简单形式是:x(k+ ...

  9. 机器学习 | 梯度下降原理及Python实现

    文章目录 1. 梯度下降 1.1 批量梯度下降(BGD) 1.1.1 学习率的设置 1.1.2 Python 实现 BGD 1.2 随机梯度下降(SGD) 1.2.1 Python 实现 SGD 1. ...

最新文章

  1. sql server中对xml进行操作
  2. mysql 删除记录代码_mysql 删除记录时报错
  3. [New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析
  4. linux 磁盘簇,linux系统exec簇工作原理
  5. 基于matlab的音乐合成论文,基于matlab软件的音乐合成毕业论文.doc
  6. 使用 JSONModel
  7. CCS10.2安装步骤
  8. python工资条教程_批量发工资怎么操作_利用python轻松解决用邮箱批量发工资条...
  9. IDEA类和方法注释模板设置(非常详细)
  10. 你还不明白如何解决分布式Session?看这篇就够了!
  11. 10 杀手级的网络管理员的工具
  12. 3D全景模型展示可视化技术演示
  13. Python——青蛙旅行项目
  14. Manjaro更换系统默认字体,主题
  15. c语言规定的主函数名是,C语言源程序中主函数名由系统规定为_______,程序员是不能改变的。...
  16. 爬虫入门教程 | 使用selenium爬取微博热门数据
  17. 身份证号码有效性验证
  18. 思考方法,程序员生存之道
  19. 讯飞智能办公本Air,迈向高效办公的新利器
  20. 一句“质量好”没什么用!好产品你应该这样告诉客户

热门文章

  1. 264分析两大利器 和 视频系列下载:264VISA和Elecard StreamEye Tools
  2. H.264的码率控制算法
  3. Springboot:监控与管理 Actuator
  4. [LeetCode] 35. Search Insert Position
  5. 设计模式之Builder (创建者模式)的一些个人理解(转)
  6. 转:upload.parseRequest为空
  7. 页面乱码及页面传值出现乱码
  8. 数据结构排序法之堆排序he归并排序
  9. 李洋疯狂C语言之将”you are come from shanghai ”倒置为”shanghai from come are you”,将句子中的单词位置倒置,而不改变单词内部结构
  10. 解说redis中如何实现高可用