机器学习_回归分析·1

概述

机器学习就不多说了,回归分析呢是机器学习的算法里面比较简单的一个,那什么事回归分析呢?具体概念参照【百度百科】,我的理解,回归就是说任何事物的发展都会回归均值,比如抛硬币次数多了之后,概率总会回归到50%,一家人的升高总会回归到人类的平均身高这些。而回归分析就是通过分析影响最终结果的几个因素,通过大量数据分析出他们对最终结果的影响率是多少,最后得出一个回归模型,当把新的影响因素的值带进去后,能得到一个较准确的预测的值。

线性回归

回归分为线性回归和非线性回归,区分主要是通过公式画出来的图像,如果是一条直线,那就是线性回归,如果是曲线,那就是非线性回归。

线性回归公式

一元线性回归的公式: h w ( x ) = w 0 + w 1 x 1 h_w(x) = w_0+w_1x_1 hw(x)=w0+w1x1
多元线性回归公式: h w ( x ) = 2 0 + w 1 x 1 + w 2 x 2 . . . + w m x m h_w(x) = 2_0+w_1x_1+w_2x_2...+w_mx_m hw(x)=20+w1x1+w2x2...+wmxm

代价函数

代价函数又叫损失函数,定义参照【百度百科】,我的理解就是,损失函数是我们通过公式得到的预测值与实际的真实值之间的误差,把所有的误差加起来求平均值,当这个平均值愈小的时候,我们预测值与真实值之间的误差就愈小,说明我们的预测越准确。
一元线性回归的代价函数公式: J ( w 0 , w 1 ) = Σ i = 1 m ( y i − h w ( x i ) ) 2 / 2 m J(w_0,w_1) = \Sigma_{i=1}^m(y^i-h_{w}(x^i))^2/2m J(w0,w1)=Σi=1m(yihw(xi))2/2m
Σ \Sigma Σ表示累加
m 表示有多少个样本点
y i y^i yi 表示真实值
h w ( x i ) h_w(x^i) hw(xi) 表示带入上面线性回归公式得到的预测值。

梯度下降法

梯度下降法是机器学习中的一种算法,具体参照【百度百科】,我的理解是,假如在一个大坑里面,要走到坑的最低点,使用梯度下降法就跟盲人行走一样,一点一点往前面试,如果是低的,就往前走一步,如果是高的,就往回走一步,通过走了多次后,最终就会走到坑最低点附近。
梯度下降法公式: θ j : = α ∗ α / α θ j ∗ J ( θ 0 , θ 1 ) \theta{j} := \alpha* \alpha /\alpha\theta_j*J(\theta_0,\theta_1) θj:=αα/αθjJ(θ0,θ1)
J ( θ 0 , θ 1 ) J(\theta_0, \theta_1) J(θ0,θ1)表示代价函数 J =1或 J = 0

一元线性回归实例

有如下数据:data.csv

32.50234526945331.7070058465699
53.42680403327568.7775959816389
61.530358025636462.5623822979458
47.47563963478671.5466322335677
59.813207869512387.2309251336873
55.142188413943878.2115182707992
52.21179669221479.6419730498087
39.29956669431759.1714893218695
48.105041691768275.331242297063
52.550014442733871.3008798868503

左边一行是自变量,右边一行是因变量。下面我对它做回归分析,最后的结果就是得到一个模型,当传入一个自变量的时候,能预测到相对准确的因变量。(注:实际数据不只是这么一点,太多懒得打出来,格式大概是这样的就是了。)

import numpy as np
import matplotlib.pyplot as plt

# 加载数据
data = np.genfromtxt(r'data.csv', delimiter=',')
# 切分数据
x_data = data[:,0] # 自变量,所有行,第0列
y_data = data[:,1] # 因变量,所有行,第1列

# 学习率
lr = 0.0001
# 截距
b = 0
# 斜率
k = 0
# 迭代次数
times = 50

# 梯度下降法求导
def gradient_descent(x_data, y_data, lr, b, k, times):
	m = float(len(x_data))
	# 循环times次
	for i in times:
		b_grad = 0
		k_grad = 0
		# 计算梯度的总和再求平均值
		for j in range(0, len(x_data)):
			b_grad += ((b+k*x_data[j]) - y_data[j])
			k_grad += ((b+k*x_data[j]) - y_data[j])*x_data[j]
		# 更新b和k
		b = b - (lr*b_grad/m)
		k = k - (lr*k_grad/m)
	return b,k

# 画图
b,k = gradient_descent(x_data,y_data,lr,b,k,times)
plt.plot(x_data,y_data, 'b.')
plt.plot(x_data, b+x_data*k,'r')
plt.show()		

在这里插入图片描述
最终画出的图形就是这样,当我们带入一个x值时,观察他预测的结果与真实值。

# 预测值
h = b+k*x_data[3]
print(h,y_data[3])
# 结果
# 70.2420794647962 71.54663223356778

相对来说偏差还是有点大,说明我们的算法还不够准确,但总的来说,大概就是这么个方法。
这个是根据公式创建函数来实现算法,其实这些算法有很多机器学习的库里面都是封装好了的,直接用就可以了。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 加载数据
data = np.genfromtxt(r'data.csv', delimiter=',')
# 切分数据,注意使用第三方库的时候,需要把数据处理成指定格式
x_data = data[:,0, np.newaxis] # 自变量,所有行,第0列
y_data = data[:,1, np.newaxis] # 因变量,所有行,第1列

# 创建并拟合模型
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()

画出的图形是与上面的类似的,我们现在来测试一下这个模型的准确率

h = model.predict(x_data)[3]
print(h,y_data[3])

# 结果
# [70.77427966] [71.54663223]

比我们自己写的准确了好多。

@快乐是一切

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值