本文介绍机器学习中的线性模型的基本形式和求解线性回归方程方法
设问题为:判断一个同学对机器学习算法的掌握程度
有以下观点:1.数学基础
2.高级语言掌握程度
3.编程能力
4.其他
我们认为:1.数学基础是学习机器学习算法的最基本要素,其重要性占全部要素的60%
2.高级语言掌握程度,3.编程能力,并不是学习机器学习算法的核心要素,其重要性各占全部要素的%20
4.其他属性可能不是很关键的判断要素(比较基本的要素,同学都具有),我们用一个常量b来表示
则对某个同学样例(具有上述四个属性)其掌握程度可以用函数表示为
掌握度=0.6*数学基础+0.2*高级语言掌握程度+0.2*编程能力+b
则掌握度是这三个属性的函数,且该函数是一个线性函数,我们用标准的x,y形式表示如下
则我们将该问题推广到任意数据集其表示形式如下(具有任意个属性的数据集)
f(x)是在相关属性下(x1,x2,...)对样例的某一种特征的度量,其参数ω =(ω1,ω2,...)视为相关属性对特征度量的重要性(称为各个属性的权重或权)。
这是一个标准的线性方程,我们的目标就是求它的参数(ω,b)
我们的任务是在相关属性下对样例的某一特征进行度量,我们希望这样的度量是最好的,度量是最准确的
那我们怎么判断我们的度量是准确的呢?
用标准度量值与我们的度量函数值之差的绝对值来对准确度进行度量(差值的绝对值越小说明越接近,度量越准确)
我们将上述使用差值来度量准确度的方法推广到整个数据集(所有样例)
均方误差:
上式为均方误差的标准形式,这是对所有样例的误差值的平方和,这里均方误差用平方代替了绝对值,在一定程度上提高了差值的精确度,我们依然可以以我们自己的思维来建模,即使用绝对值而不是平方,但是模型的准确度会受影响。但是我们的基本思路都是使用差值来度量偏差。
所以综上所述,我们的目标是求得使上述均方误差最小的参数ω和b
我们将线性方程表示为矩阵乘法的形式
(以下向量表达式转变为矩阵乘积的相关知识可以参考各种线性代数教材,我推荐David C Lay所写的《Linear Algebra and its Applications》,中文译本为《线性代数及其应用》,机械工业出版社出版)
参数向量ω进行扩展,将b包含进去
数据集的样例属性用矩阵表示为,我们将常量b也视为一个属性的权重,所以,我们增加一个值全为1的属性列
则所有测试样例的计算结果用向量表示为
则所有样例的结果表示为Xω=Y(这是矩阵乘法,不是对应位置相乘)
则我们的均方误差表示为
我们要求使得均方误差最小的参数ω,表示如下
这是一个求关于参数ω的函数,我们要求这个函数的极小值,求极值问题方法为,将原方程对ω求导,对求导后的方程取0,即可求得ω
求导结果如下(这里涉及矩阵求导):
矩阵求导公式参考博文(我就是参考的这篇):
令上式为0求得ω
则最后我们得到的线性函数(回归函数)为
Python实现如下:
数据集使用该博文所使用的数据集
代码中的可视化部分借鉴于他人的博客(不记得是哪一篇了),共同学习,共同进步
散点图和回归曲线如下
计算回归曲线的步骤在主函数里
源码文件和数据集我已经上传到我的资源(地址:)
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import pyplot as plt
#读取文件数据
def loaddata(filename):
dataset = []
fp = open(filename)
for i in fp.readlines():
#数据集比较庞大,只使用前1000个数据
if len(dataset) >= 1000:
break
a = i.strip().split()
#只是用其中位置为3,4,5的数据,形成一个三维数据,便于可视化
dataset.append([float(a[3]), float(a[4]), float(a[5])])
return dataset
#可视化数据,绘制回归曲线
def Data_plot(data, w):
x = data[:,0]
y = data[:,1]
z = data[:,2]
x1 = [0, 600]
y1 = [0, 600]
z1 = [w[2, 0], 600*w[0, 0]+600*w[1, 0]+w[2, 0]]
# 绘制散点图
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
ax.plot(x1, y1, z1, 'r', color = 'black')
# 添加坐标轴(顺序是Z, Y, X)
ax.set_zlabel('Z', fontdict={'size': 15, 'color': 'red'})
ax.set_ylabel('Y', fontdict={'size': 15, 'color': 'red'})
ax.set_xlabel('X', fontdict={'size': 15, 'color': 'red'})
plt.show()
if __name__ == '__main__':
#读取文件
dataset = loaddata('CD3-8-45-4.txt')
#提取属性,数据中前两列作为属性,最后一列作为标准特征度量
x = np.mat(dataset)[:,(0,1)]
y = np.mat(dataset)[:,2]
#调整属性矩阵(在原矩阵最后一列添加值为1的列)
a = np.ones((len(dataset), 1))
x = np.c_[x, a]
#计算属性矩阵x的转置
xt = np.transpose(x)
#按照计算式计算参数w,np.dot函数用于计算矩阵乘法
a = np.dot(xt, x).I
b = np.dot(a, xt)
w = np.dot(b, y)
#绘制回归函数曲线和散点图,不用掌握
Data_plot(np.mat(dataset), w)