从零开始-Machine Learning学习笔记(7)-Linear Regression的python手工实现(不使用第三方库)
2018-04-19 16:07
295 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kabuto_hui/article/details/80006466
从零开始-Machine Learning学习笔记(7)-Linear Regression的python手工实现(不使用第三方库)
最近刚刚做完华为2018软件精英挑战赛,本次比赛不让使用第三库,所以一些算法不得不“手工”实现。所以在不使用第三方库的情况下实现了一些算法并将其整理一下发到了博客上。
因为numpy也是第三方库,所以要实现线性回归算法,就不能使用矩阵的操作。当然这里也有一些大神实现了矩阵的运算,在此暂且不表。
其原理在之前的博客中也提到了从零开始-Machine Learning学习笔记(2)-Linear Regression(线性回归)。主要是进行梯度下降的运算操作。
具体算法实现如下:
# -*- coding: utf-8 -*- ''' Linear Regression(线性回归算法)的手工实现(无第三方库) Author : Kabuto_hui Date : 2018.04.16 ''' def compute_error(w,data): """ 计算误差 :param w: 求解参数 :param data: 传入数据 :return: 当前误差 """ error_count = 0 for i in range(len(data)): x = data[i][:len(data[i]) - 1] #取出x, list y = data[i][-1] #取出y error_count = error_count + (w_mul_x(w, x) - y)**2 return error_count / (2 * len(data)) def mean_normlization(x): ''' 均值归一化:(x - s) /(max - min),其中s是均值 :param x: 数据序列,list :return: 返回处理好的数据 ''' mean_x = sum(x) / len(x) x_temp = [(i - mean_x) / (max(x) - min(x)) for i in x] return x_temp def w_mul_x(w,x): """ 模拟矩阵运算,计算两个向量的数量积 :param w: w :param x: x :return: 计算结果 """ sum_wx = 0 for (i, j) in zip(w, x): sum_wx = sum_wx + i * j return sum_wx def compute_gradient(w,data,learning_rate): """ 计算梯度下降 :param w: 求解参数list :param data: 训练数据list[list,list] :param learning_rate: 学习率 :return: 返回当前w的更新结果 """ w_temp = [0 for n in range(len(w))] #w的计算结果临时存储,最后一起更新 partial_diff = [0 for m in range(0,len(data))] #用于存储偏微分方程城的结果 for j in range(0,len(w)): for i in range(0,len(data)): x = data[i][:len(data[i]) - 1] y = data[i][-1] partial_diff[i] = (w_mul_x(w, x) - y) * x[j] #计算偏微分 w_temp[j] = w[j] - learning_rate * sum(partial_diff) / len(data) #同时更新w w = w_temp return w def LinearRegression(w_initial, data, learning_rate, iterations): """ 线性回归算法 :param w_initial: 求解参数 :param data: 训练数据, list[list] --->每个训练样例占 :param learning_rate: 学习率 :param iterations: 迭代次数 :return: 返回训练好的参数 """ w = w_initial for i in range(iterations): w = compute_gradient(w, data, learning_rate) return w if __name__ == "__main__": # x1+x2 = y data = [[0.1,0.2,0.3],\ [0.2,0.3,0.5],\ [0.1,0.4,0.5],\ [0.2,0.2,0.4],\ [0.3,0.4,0.7],\ [0.5,0.6,1.1],\ [0.7,0.8,1.5],\ [1.2,1.3,2.5],\ [0.9,1.1,2.0],\ [0.4,0.5,0.9]] w_initial = [0,0] learning_rate = 0.1 iterations = 1000 w = LinearRegression(w_initial, data, learning_rate, iterations) print(w)
更多的算法实现可以去我的Github。如果觉得有帮助的话请别忘了点个Star~~~
阅读更多相关文章推荐
- 使用50行Python代码从零开始实现一个AI平衡小游戏
- python自动化测试(4)-使用第三方python库技术实现
- python使用第三方模块实现给注册用户发送验证码
- python cgi ajax - 使用CGIHTTPServer实现一个ajax程序
- (转)在DELPHI7中不使用任何第三方控件,实现放在工具栏上可拖动的XP风格菜单
- 使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)
- 使用 Python 实现多进程
- Python使用Com组件及Access查询分析类实现
- python实现的最近最少使用算法
- 使用第三方工具(RegexKitLite)实现正则表达式
- 用Python 实现刷钻网上抢任务,并实现一个简单的限制使用时间的功能
- 使用python和redis实现实时聊天室
- 使用 Python 和 Oracle 数据库实现高并发性
- 使用SharedStore的Python实现方法
- iphone中使用第三方工具(RegexKitLite)实现正则表达式
- 近期准备写一系列关于使用python实现常用算法的文章
- 使用python实现文本文件合并功能
- 使用VC下的cl和link手工创建dll并实现函数导入
- ASP.NET使用第三方库实现js图表
- 使用SWIG实现C++扩展Python