程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE.zip

线性回归

决定系数越接近一那么预测效果越好

对于多元线性回归和一元线性回归推导理论是一致的,只不过参数是多个参数而已

梯度下降

梯度下降法存在局部最小值

太小迭代次数多,太大将无法迭代到最优质

梯度下降发容易到达局部最小值

凸函数使用局部下降法一定可以到全部最小值,所以不存在局部最小值才可以

下面两个demo是一元函数的拟合

1使用梯度下降法的数学公式进行的机器学习代码

 import numpy as np
from matplotlib import pyplot as plt
#读取数据
data = np.genfromtxt('data.csv',delimiter=',')
x_data = data[:, ]
y_data = data[:, ]
#plt.scatter(x_data, y_data)
#plt.show()
lr = 0.0001
k =
b =
epochs =
def compute_loss(x_data, y_data, b, k):#计算损失函数
m = float(len(x_data))
sum =
for i in range(, len(x_data)):
sum += (y_data[i] - (k*x_data[i] + b))**
return sum/(*m)
def gradient(x_data, y_data, k, b, lr, epochs):#进行梯度下降
m = float(len(x_data)) for i in range(,epochs):
k_gradient =
b_gradiet =
for j in range(,len(x_data)):
k_gradient += (/m)*((x_data[j] * k + b) - y_data[j])
b_gradiet += (/m)*((x_data[j] * k + b) - y_data[j]) * x_data[j]
k -= lr * k_gradient
b -= lr * b_gradiet if i % == :
print(i)
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data + b, 'r')
plt.show() return k, b k,b = gradient(x_data, y_data, , , lr, epochs)
plt.plot(x_data, k * x_data + b, 'r')
plt.plot(x_data, y_data, 'b.')
print('loss =:',compute_loss(x_data, y_data, b, k),'b =:',b,'k =:',k)
plt.show()

2 使用Python的sklearn库

 import numpy as np
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
#读取数据
data = np.genfromtxt('data.csv',delimiter=',')
x_data = data[:, ]
y_data = data[:, ]
plt.scatter(x_data, y_data)
plt.show()
x_data = data[:, , np.newaxis]#使一位数据编程二维数据
y_data = data[:, , np.newaxis]
model =LinearRegression()
model.fit(x_data, y_data)#传进的参数必须是二维的
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')#画出预测的线条
plt.show()

3使用梯度下降法完成多元线性回归(以二元为例)

 import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #用来画3D图的包
# 读入数据
data = genfromtxt(r"Delivery.csv",delimiter=',')
print(data)
# 切分数据
x_data = data[:,:-]
y_data = data[:,-]
print(x_data)
print(y_data)
# 学习率learning rate
lr = 0.0001
# 参数
theta0 =
theta1 =
theta2 =
# 最大迭代次数
epochs = # 最小二乘法
def compute_error(theta0, theta1, theta2, x_data, y_data):
totalError =
for i in range(, len(x_data)):
totalError += (y_data[i] - (theta1 * x_data[i,] + theta2*x_data[i,] + theta0)) **
return totalError / float(len(x_data)) def gradient_descent_runner(x_data, y_data, theta0, theta1, theta2, lr, epochs):
# 计算总数据量
m = float(len(x_data))
# 循环epochs次
for i in range(epochs):
theta0_grad =
theta1_grad =
theta2_grad =
# 计算梯度的总和再求平均
for j in range(, len(x_data)):
theta0_grad += (/m) * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
theta1_grad += (/m) * x_data[j,] * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
theta2_grad += (/m) * x_data[j,] * ((theta1 * x_data[j,] + theta2*x_data[j,] + theta0) - y_data[j])
# 更新b和k
theta0 = theta0 - (lr*theta0_grad)
theta1 = theta1 - (lr*theta1_grad)
theta2 = theta2 - (lr*theta2_grad)
return theta0, theta1, theta2
print("Starting theta0 = {0}, theta1 = {1}, theta2 = {2}, error = {3}".
format(theta0, theta1, theta2, compute_error(theta0, theta1, theta2, x_data, y_data)))
print("Running...")
theta0, theta1, theta2 = gradient_descent_runner(x_data, y_data, theta0, theta1, theta2, lr, epochs)
print("After {0} iterations theta0 = {1}, theta1 = {2}, theta2 = {3}, error = {4}".
format(epochs, theta0, theta1, theta2, compute_error(theta0, theta1, theta2, x_data, y_data)))
ax = Axes3D(plt.figure())#和下面的代码功能一样
#ax = plt.figure().add_subplot(, projection='3d')#plt.figure().add_subplot和plt.subplot的作用是一致的
ax.scatter(x_data[:, ], x_data[:, ], y_data, c='r', marker='o', s=) # 点为红色三角形
x0 = x_data[:, ]
x1 = x_data[:, ]
# 生成网格矩阵
x0, x1 = np.meshgrid(x0, x1)#生成一个网格矩阵,矩阵的每个点的第一个轴的取值来自于x0范围内,第二个坐标轴的取值来自于x1范围内
z = theta0 + x0 * theta1 + x1 * theta2
# 画3D图
ax.plot_surface(x0, x1, z)
# 设置坐标轴
ax.set_xlabel('Miles')
ax.set_ylabel('Num of Deliveries')
ax.set_zlabel('Time') # 显示图像
plt.show()

4:使用Python的sklearn库完成多元线性回归

import numpy as np
from numpy import genfromtxt
from sklearn import linear_model
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 读入数据
data = genfromtxt(r"Delivery.csv",delimiter=',')
print(data)
# 切分数据
x_data = data[:,:-]
y_data = data[:,-]
print(x_data)
print(y_data)
# 创建模型
model = linear_model.LinearRegression()
model.fit(x_data, y_data)
# 系数
print("coefficients:",model.coef_) # 截距
print("intercept:",model.intercept_) # 测试
x_test = [[,]]
predict = model.predict(x_test)
print("predict:",predict)
ax = plt.figure().add_subplot(, projection='3d')
ax.scatter(x_data[:, ], x_data[:, ], y_data, c='r', marker='o', s=) # 点为红色三角形
x0 = x_data[:, ]
x1 = x_data[:, ]
# 生成网格矩阵
x0, x1 = np.meshgrid(x0, x1)
z = model.intercept_ + x0*model.coef_[] + x1*model.coef_[]
# 画3D图
ax.plot_surface(x0, x1, z)#参数是二维的,而model.prodict(x_data)是一维的。
# 设置坐标轴
ax.set_xlabel('Miles')
ax.set_ylabel('Num of Deliveries')
ax.set_zlabel('Time') # 显示图像
plt.show()

5 多项式回归拟合

 import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures#多项式
from sklearn.linear_model import LinearRegression # 载入数据
data = np.genfromtxt("job.csv", delimiter=",")
x_data = data[:,]
y_data = data[:,]
plt.scatter(x_data,y_data)
plt.show()
x_data
x_data = x_data[:,np.newaxis]
y_data = y_data[:,np.newaxis]
x_data
# 创建并拟合模型
model = LinearRegression()
model.fit(x_data, y_data)
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, model.predict(x_data), 'r')
plt.show()
# 定义多项式回归,degree的值可以调节多项式的特征
poly_reg = PolynomialFeatures(degree=)
# 特征处理
x_poly = poly_reg.fit_transform(x_data)
# 定义回归模型
lin_reg = LinearRegression()
# 训练模型
lin_reg.fit(x_poly, y_data)
# 画图
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, lin_reg.predict(poly_reg.fit_transform(x_data)), c='r')
plt.title('Truth or Bluff (Polynomial Regression)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()
# 画图
plt.plot(x_data, y_data, 'b.')
x_test = np.linspace(,,)
x_test = x_test[:,np.newaxis]
plt.plot(x_test, lin_reg.predict(poly_reg.fit_transform(x_test)), c='r')
plt.title('Truth or Bluff (Polynomial Regression)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()
 

线性回归和梯度下降代码demo的更多相关文章

  1. 机器学习算法整理(一)线性回归与梯度下降 python实现

    回归算法 以下均为自己看视频做的笔记,自用,侵删! 一.线性回归 θ是bias(偏置项) 线性回归算法代码实现 # coding: utf-8 ​ get_ipython().run_line_mag ...

  2. 线性回归、梯度下降(Linear Regression、Gradient Descent)

    转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 实例 首先举个例子,假设我们有一个二手房交易记录的数据集,已知房屋面积.卧室数量和房屋的交易价格,如下表: ...

  3. Andrew Ng机器学习公开课笔记 -- 线性回归和梯度下降

    网易公开课,监督学习应用.梯度下降 notes,http://cs229.stanford.edu/notes/cs229-notes1.pdf 线性回归(Linear Regression) 先看个 ...

  4. 斯坦福机器学习视频笔记 Week1 线性回归和梯度下降 Linear Regression and Gradient Descent

    最近开始学习Coursera上的斯坦福机器学习视频,我是刚刚接触机器学习,对此比较感兴趣:准备将我的学习笔记写下来, 作为我每天学习的签到吧,也希望和各位朋友交流学习. 这一系列的博客,我会不定期的更 ...

  5. Machine Learning--week2 多元线性回归、梯度下降改进、特征缩放、均值归一化、多项式回归、正规方程与设计矩阵

    对于multiple features 的问题(设有n个feature),hypothesis 应该改写成 \[ \mathit{h} _{\theta}(x) = \theta_{0} + \the ...

  6. 2018.4.23-ml笔记(线性回归、梯度下降)

    线性回归:找到最合适的一条线来最好的拟合我们的数据点. hθ(x) = θixi=θTx    θ被称之为权重参数    θ0为拟合参数 对每个样本yi=θTxi + εi    误差ε是独立并且具有 ...

  7. 线性回归与梯度下降(ML作业)

    Loss函数 题目一:完成computeCost.m function J = computeCost(X, y, theta) %COMPUTECOST Compute cost for linea ...

  8. 机器学习算法(优化)之一:梯度下降算法、随机梯度下降(应用于线性回归、Logistic回归等等)

    本文介绍了机器学习中基本的优化算法—梯度下降算法和随机梯度下降算法,以及实际应用到线性回归.Logistic回归.矩阵分解推荐算法等ML中. 梯度下降算法基本公式 常见的符号说明和损失函数 X :所有 ...

  9. 从梯度下降到Fista

    前言: FISTA(A fast iterative shrinkage-thresholding algorithm)是一种快速的迭代阈值收缩算法(ISTA).FISTA和ISTA都是基于梯度下降的 ...

随机推荐

  1. HDU-1754-I Hate It-线段树-求区间最值和单点修改

    开学新拉的题目,老题重做,思路会稍微比之前清晰,不过这也算是一点点进步了. 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现 ...

  2. 8-MySQL高级-主从-2

    详细配置主从同步的方法 主和从的身份可以自己指定,我们将虚拟机Ubuntu中MySQL作为主服务器,将Windows中的MySQL作为从服务器. 在主从设置前,要保证Ubuntu与Windows间的网 ...

  3. codeforces round#524 D - Olya and magical square /// 大概算是数学规律题?

    题目大意: t 个测试用例  (1≤t≤103) 给定n k  (1≤n≤10^9,1≤k≤10^18) 表示有一个边长为2^n的正方形格子 每次操作只能将一个格子切割为左上左下右上右下的四等分格子 ...

  4. WriteFile

    从R3 ,到磁盘 1:kernel32  WriteFile 1) 挺惊讶的,符号好使了, 前面大概4条判断,根据句柄判断要写到什么地方,一共有4个地方可能要去, stdin   stdout   s ...

  5. HTML_案例(首页制作)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 源码编译安装nginx详细步骤

    1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 下载后通过tar -xvz ...

  7. windows下怎么给ubantu虚拟机全屏的处理

    ubantu版本时16.04 windows下窗口太小需要设置 相信很多人在装虚拟机的时候,遇到了窗口过小不能自适应的问题.我也是查了好多资料,都说安装Vmware Tools即可解决,还有说修改分辨 ...

  8. shell 通配符,管道符,输入/输出重定向,命令置换

    1. echo 输出   [echo 输出的内容 ]把内容输出到终端上 如果字符串使用双引号,echo命令原样输出   [ echo "hello       world" ]  ...

  9. go包flag系统包简单使用

    一.代码 package main import ( "flag" "fmt" ) //定义命令行参数,这个mode是内存地址,参数1是命令行名称,参数2是命令 ...

  10. 尚学linux课程---3、linux网络说明

    尚学linux课程---3.linux网络说明 一.总结 一句话总结: 如果NAT模式:linux,VMnet8,虚拟出来的路由器 要在同一个网段, 那么 linux才能 通过 网络地址转换 经过wi ...