看到一副图片挺有意思,放在片头

“傍晚小街路面上沁出微雨后的湿润,和煦的西风吹来,抬头看看天边的晚霞,嗯明天又是一个好天气。走到水果摊旁,挑了个根蒂蜷缩、敲起来声音浊响的青绿西瓜,一边满心期待着皮薄肉厚瓤甜的爽落感,一边愉快地想着,这学期狠下了工夫,基础概念弄得很清楚,算法作业也是信手拈来,这门课成绩一定差不了!”

上面的经验是靠我们人类自身完成的,计算机能帮忙么?机器学习正是这样一门学科,它致力于研究如何通过计算的手段,利用经验来改善系统自身的性能。

现在各行各业强调使用大数据手段进行数据分析,大数据的上帝视角带给我们的核心竞争力是对于个体甚至群体行为的预测,那么我们就来看看使用回归类算法对于数值型的数据如何来进行预测

什么是回归?

优点:结果易于理解,计算上不复杂。

缺点:对非线性的数据拟合不好。

适用数据类型:数值型和标称型数据。

使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签

回归的一般方法:

(1)收集数据:采用任意方法收集数据;

(2)准备数据:回归需要数值型数据,标称型数据将被转换成二值型数据;

(3)分析数据:绘出数据的可视化二维图,有助于对数据做出理解和分析。在采用缩减法求得新回归系数后,可以将新拟合线绘在图上进行对比;

(4)训练算法:找到回归系数;

(5)测试算法:使用R2(相关系数的平方)或顶测值和数据的拟合度,来分析模型的效果;

使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测出连续型数据而不仅仅是离散型的类别标签

原理简介

普通最小二乘法(ordinary least squares)

问题:如何知道sklearn拟合公式的参数结果是多少y=ax+b怎么知道a,b?

#

线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数(最小化误差平方和)对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。


典型业务场景

假设一路公交,在其始发站每小时会来很多人等车,坐车人数会和很多因素相关(天气,是否节假日)。

为了方便调度人员预测下一个小时,或者当天的坐车人数,可以采用回归算法制作基于时间的预测系统。

可能要有的功能

1.出现异常增量时候的预警,异常增量,概念的定义。

2.预测值和真实值的差别

数据准备

history 表中记录了所有公交卡历史记录

建表语句,从已经采集的数据中构建,主要为两列

create table t_hour_count
(
quantity varchar2(128)
time_frame varchar2(128)
);

其中人的主要标识为公交卡(id),我们从公交卡的记录表history中将每小时坐车的人筛选出来,由于只要数量,所以只要group_by之后再 去重再count

create table  t_hour_count as
select count(distinct ta.id) quantity, group_by time_frame
from (select tt.*, to_char(tt.update_time, 'yyyymmddhh24') group_by
from (select *
from history
where id in (select distinct id
from t_公交卡 tc
where tc.type = '公交')) tt
where update_time >
to_date('20170716 00:00:00', 'yyyymmdd hh24:ss:mi')
and update_time <
to_date('20170721 00:00:00', 'yyyymmdd hh24:ss:mi')) ta
group by ta.group_by
order by group_by;

参考代码

python链接oracle 的简单框架

#coding = utf-8
import cx_Oracle
import time
import json import os
os.environ['NLS_LANG']='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
#-----------------------connect oracle-------------------------------
username = '**'
password = '**'
ip = '*.*.*.*'
service_name = '*' def getConnOracle(username,password,ip,service_name):
try:
conn = cx_Oracle.connect(username+'/'+password+'@'+ip+'/'+service_name) # 连接数据库
return conn
except Exception:
print(Exception) conn = getConnOracle(username, password, ip, service_name) def getOracleSelect(conn): cursor = conn.cursor()
try:
sqlString = "select time_frame,quantity from t_hour_count order by time_frame"
sqlresult = cursor.execute(sqlString) # 使用cursor进行各种操作
result = sqlresult.fetchall()
return result except cx_Oracle.DatabaseError as msg:
print(msg)
finally:
cursor.close()
#----------------------------------

自定义数据指标统计

计算一段时间的均值,最大,最小等指标

#----------------------------------------------------------------------------------------------
def my_average(result_list = []):
sumvalue = 0
if len(result_list)==0:
return 0
for i in result_list:
sumvalue = i[1] + sumvalue
return int(sumvalue/len(result_list)) #add 'my' to declare this function is user-defined
def my_min(result_list = []):
if len(result_list)==0:
return 0
valuelist = [i[1] for i in result_list]
return min(valuelist) def my_max(result_list = []):
if len(result_list)==0:
return 0
valuelist = [i[1] for i in result_list]
return max(valuelist) def generateAllresult(): localtime = time.localtime() all_result = [list(i) for i in getOracleSelect(conn)]
all_result_time = [[(time.strptime(i[0],"%Y%m%d%H")),i[1]] for i in all_result]
all_result_time_today = [i for i in all_result_time if i[0].tm_yday > localtime.tm_yday-1]
all_result_time_yesterday = [i for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-2] all_result_time_thedaybeforeyesterday = [i for i in all_result_time if i[0].tm_yday < localtime.tm_yday-1 and i[0].tm_yday > localtime.tm_yday-3] all_result_time_last3day = [i for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-4] all_result_time_last7day = [i for i in all_result_time if i[0].tm_yday < localtime.tm_yday and i[0].tm_yday > localtime.tm_yday-8] all_result_time_lastweekthisday = [i for i in all_result_time if i[0].tm_yday < localtime.tm_yday-6 and i[0].tm_yday > localtime.tm_yday-8] my_dict = {"all_result":all_result_time,"today":all_result_time_today,"yesterday":all_result_time_yesterday,"before_yesterday":all_result_time_thedaybeforeyesterday,"last3day":all_result_time_last3day,"last7day":all_result_time_last7day,"lastweekthisday":all_result_time_lastweekthisday}
my_result_dict = {}
for item in my_dict:
#print(my_dict[item])
#print(len(my_dict[item]))
my_result_dict[item] = [my_average(my_dict[item]),my_max(my_dict[item]),my_min(my_dict[item])]
#print(my_result_dict)
return my_result_dict

Flask页面展示

还有一个3js需要下载

整个项目的目录结果如下图所示:

在windows上cmd中居然也有tree命令,使用tree /f显示如下结构:

页面html:


<title xmlns="http://www.w3.org/1999/html">monitor.com</title>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Highstock Example</title> <script type="text/javascript" src="../static/js/jquery-1.8.2.min.js"></script>
<style type="text/css">
${demo.css}
</style>
<script type="text/javascript">
$(function () {
$.getJSON('/data?callback=?', function (data) { // Create the chart
$('#container').highcharts('StockChart', { rangeSelector: {
inputEnabled: $('#container').width() > 480,
selected: 1
}, title: {
text: '人数情况小时统计'
}, series: [{
name: '人数情况小时统计',
data: data,
type: 'spline',
tooltip: {
valueDecimals: 2
}
}]
});
});
});
</script>
</head> <p>
<script src="../static/js/2.js"></script>
<script src="../static/js/3.js"></script> <div id="container" style="height: 400px"></div> <script type="text/javascript"> $(function () {
$.getJSON('/predict?callback=?', function (data) { });
});
</script> <p>{{"统计概况"}}</p>
<table border="1">
<tr>
<td>日期</td>
<td> 平均值 </td>
<td>最大值</td>
<td>最小值</td>
</tr>
{%for key in mydict%}
<tr>
<td>{{key}}</td>
<td>{{mydict[key][0]}}</td>
<td>{{mydict[key][1]}}</td>
<td>{{mydict[key][2]}}</td>
</tr>
{%endfor%}
</table> <img src="../static/sample.png" width="640" height="480"> </body>
</html>


from flask import Flask, request, render_template app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def hello():
if request.method == "GET":
today_Regression()
return render_template("mon.html",mydict=generateAllresult())
else:
return "post method is not define" @app.route("/data", methods=["GET"])
def getdata():
#today_Regression()
ones = [[(time.strptime(i[0],"%Y%m%d%H")), i[1]] for i in getOracleSelect(conn)]
ones = [[time.mktime(i[0])*1000+28800000,i[1]] for i in ones]
return "%s(%s);" % (request.args.get('callback'), json.dumps(ones)) ''' '''

sklearn 回归预测



#--------------------------------------------------------------------------------------
from sklearn import linear_model
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd #dataset = pd.read_csv('CSV.csv')
#x is time ,y is people like [[1],[2],[3]]
def my_Regression(X_array=[[]],Y_array=[[]]):
X = np.array(X_array)
y = np.array(Y_array)
print (type(X)) from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 2)
X_poly = poly_reg.fit_transform(X)
lin_reg_2 = linear_model.LinearRegression()
lin_reg_2.fit(X_poly,y) print(lin_reg_2.intercept_) X_grid = np.arange(min(X),max(X),0.1)
X_grid = X_grid.reshape((len(X_grid),1))
plt.scatter(X,y,color = 'red')
plt.plot(X_grid,lin_reg_2.predict(poly_reg.fit_transform(X_grid)),color = 'blue')
plt.title('predict(2-Polynomial Regression)')
plt.xlabel('time')
plt.ylabel('people count')
plt.savefig("./static/sample.png",dpi=200)
#plt.show()
def today_Regression(): localtime = time.localtime() all_result = [list(i) for i in getOracleSelect(conn)]
all_result_time = [[(time.strptime(i[0],"%Y%m%d%H")),i[1]] for i in all_result]
all_result_time_today = [i for i in all_result_time if i[0].tm_yday > localtime.tm_yday-1] X_array = [[time.mktime(i[0])] for i in all_result_time if i[0].tm_yday > localtime.tm_yday-1]
Y_array = [i[1] for i in all_result_time_today] my_Regression(X_array,Y_array) if __name__ =='__main__': app.run(host="0.0.0.0", port=55555, debug=True)

使用一天的数据绘制一个二次函数,保存到本地作为一张图片



但是sklearn怎么输出二次函数的参数呢,我一直没有找到


未完待续,将来将这个小项目共享出来

js文件下载地址:

1:

http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js

2:2.js

http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js

3:3.js

http://code.highcharts.com/modules/exporting.js

大数据框架下的回归预测

官方文档

http://spark.apache.org/docs/latest/ml-classification-regression.html#regression

中文翻译

http://www.apache.wiki/display/Spark/ML+Pipelines

python接口:

http://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.regression

spark mllib 全面介绍:

http://www.cnblogs.com/shishanyuan/p/4747761.html

python实现:

http://www.cnblogs.com/adienhsuan/p/5654481.html

学习笔记:

http://www.cnblogs.com/charlotte77/p/5518368.html

参考文献

机器学习实战,第八章

周志华,机器学习

基于python3-sklearn,Flask 的回归预测系统的更多相关文章

  1. Flask之基于route装饰器的路由系统(源码阅读解析)

    一 路由系统 1. 在flask中配置URL和视图函数的路由时,首先需要在main.py中实例化一个app对象: from flask import Flask, render_template ap ...

  2. Sublime Text 2 (for OS X )配置成可以运行基于python3解释器的 .py文件

    Mac自带的python 其version是python 2.7 官网下的Sublime Text 2部署好了以后默认也是 为了使ST2 可以在command+B时可以运行基于python3的.py, ...

  3. ubantu中搭建virtualenv+python3.4+flask

    上一篇文章是基于ubantu14.04自带的Python2.7搭建的virtualenv+python+flask(需要特别注意文件夹是中文的问题),今天忙碌了三个小时,在网上大量查阅资料完成了vir ...

  4. 数据分析:基于Python的自定义文件格式转换系统

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  6. Flask中路由系统以及蓝图的使用

    一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...

  7. Flask 的路由系统 FBV 与 CBV

    Flask的路由系统 本质: 带参数的装饰器 传递函数后 执行 add_url_rule 方法 将 函数 和 url 封装到一个 Rule对象 将Rule对象 添加到 app.url_map(Map对 ...

  8. 基于Python3 神经网络的实现

    基于Python3 神经网络的实现(下载源码) 本次学习是Denny Britz(作者)的Python2神经网络项目修改为基于Python3实现的神经网络(本篇博文代码完整).重在理解原理和实现方法, ...

  9. 基于ssh框架的在线考试系统开发的质量属性

    我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...

随机推荐

  1. ZOJ 3689 Digging(贪心+dp)

    Digging Time Limit: 2 Seconds      Memory Limit: 65536 KB When it comes to the Maya Civilization, we ...

  2. org.hibernate.AssertionFailure: null id in com.you.model.User entry (don&#39;t flush the Session after a

    1.错误描写叙述 org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Sessio ...

  3. YII 数据库查询

    $userModel = User::Model(); $userModel->count(); $userModel->count($condition); $userModel-> ...

  4. nyoj--61--传纸条(一)(动态规划)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列 ...

  5. [JZOJ 5905] [NOIP2018模拟10.15] 黑暗之魂(darksoul) 解题报告 (拓扑排序+单调队列+无向图基环树)

    题目链接: http://172.16.0.132/senior/#main/show/5905 题目: oi_juruo热爱一款名叫黑暗之魂的游戏.在这个游戏中玩家要操纵一名有 点生命值的无火的余灰 ...

  6. CAS算法

    /** * CAS(Compare-And-Swap)算法保证了数据的原子性 * CAS算法是硬件对于并发操作共享数据的支持 * CAS包含了3个操作数: * 内存值 V 看成两步 读取内存值为1步 ...

  7. HOOK劫持自己

    #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include "detours ...

  8. java基础——单例设计模式(懒汉式)

    public class Test7 { // 主函数 public static void main(String[] args) { Test7.getInstance().function(9, ...

  9. JS基本功 | JavaScript专题之数组 - 方法总结

    Array.map() 1.   map() 遍历数组 语法: let new_array = arr.map(function callback(currentValue, index, array ...

  10. mybastis_20190323

    1 数据表 items.user.orders.orderdetail user id,username,birthday,sex,address; 使用原生态的jdbc的问题总结? 1 数据库链接问 ...