Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3648473
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Python/Ruby

2022-01-05 17:12:59

# -*- coding: utf-8 -*-

"""一元线性回归及代码实现.ipynb

"""

import numpy as np

import matplotlib.pyplot as plt

"""# 一、数据集"""

# 读入数据集

data = np.genfromtxt('data.csv', delimiter=',')

'''

np.genfromtxt('data.csv', delimiter=',')

第一个参数是表格数组,可以简单理解为表格文件

第二个参数是文本之间的间隔符号

'''

print(data[:5]) #

x = data[:,0]

y = data[:,1]

print(x,y)

# 将数据可视化

plt.scatter(x,y) # 散点图

plt.show()

"""# 二、建模"""

# 最小二乘法

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)) / 2.0

lr = 0.0001 # 学习率

# 最大迭代次数

epochs = 50

def gradident_descent(lr,epochs):

  k = 0 # 斜率

  b = 0 # 截距

  for epoch in range(epochs):

    # b_grad = 0

    # k_grad = 0

    # m = float(len(x))

    # for j in range(0, len(x)):

    #   b_grad += (1/m) * (((k * x[j]) + b) - y[j])

    #   k_grad += (1/m) * x[j] * (((k * x[j]) + b) - y[j])

    k_grad = (x*(k*x+b-y)).mean()

    b_grad = (k*x+b-y).mean()

    # 同步更新kb,完成一次梯度下降算法

    k -= lr * k_grad

    b -= lr * b_grad

    # 每迭代5次,输出一次图像

    # if 外汇跟单gendan5.comepoch % 5 == 0:

    #   print(f'epoch{epoch}')

    #   plt.plot(x,y,'b.') # b. 是指以蓝色的点显示

    #   plt.plot(x,k*x+b,'r')

    #   plt.show()

  return k,b

print("Starting b = {0}, k = {1}, error = {2}".format(b, k, compute_error(b, k, x, y)))

print("Running...")

k,b = gradident_descent(lr,epochs)

print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x, y)))

# 画图

plt.plot(x, y, 'b.')

plt.plot(x, k*x + b, 'r')

plt.show()

阅读(1382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~