新高考选科推荐算法原理及代码实现——python / java 版

新高考学生选科推荐算法原理及python / java 代码实现

阅读建议

技术人员建议阅读 第三、第四 中的 决策树状图、第五 Python、Java代码
一、目的
二、理论依据
三、模型参数
四、算法概述
五、代码实现
Python代码实现
Java代码实现

一、目的

本文将讲述,基于多次成绩的学生选科成绩,帮助学生找到自己的优势科目,基于学生物理/历史成绩排名优势情况、学生物理/历史成绩稳定情况、学生物理/历史成绩上升下降趋势的多次成绩排名的的物理/历史科目推荐。由于学生成绩排名相对复杂,本模型中共有 20 种基础情况及 3 种特殊情况

二、理论依据

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,广泛应用于金融风控、经济实证工具、科技等领域。T 值检验,用于判断两组数据近似程度分析,从 1908 年提出,目前广泛应用于现代医疗、航空航天等领域,经典使用场景为肿瘤及康复情况判断。

三、模型参数

statistic(T 值检验):越大于 0 则说明物理/历史成绩差异较大,越趋近进于 0 则说明物理/历史成绩差异极小
a 值(斜率):
a 为正值,代表学生成绩排名呈现下降趋势;
a 为负值,代表学生成绩排名呈现上升趋势;
a 趋近于 0 说明排名趋于稳定;
a 值越大表示进步/退步越明显。
mean(平均数)
cov(方差)

四、算法概述:

首先对学生物理/历史 3 次成绩排名进行 T 值校验,判断是否物理与历史存在趋近状况,若存在,使用线性回归进行判断排名上升下降趋势,再进一步判断。若不存在,说明物理/历史成绩有显著差异,首先判断物理/历史 3 次成绩排名平均数,取最优排名;其中还依据方差判断 3 次成绩排名稳定情况,取稳定且排名均值靠前为最优,若都不稳定则进行线性回归判断排名上升下降趋势,取条件最利于且最多的科目为最优。特殊情况详见下文详细末尾

算法决策图:

五、算法详细:

1、取每名学生 3 次考试排名,分别计算物理/历史 3 次考试方差和平均排名
2、对学生物理历史科目进行双边 T 值检验,获得 T 值,判断是否趋近(示例:例如学生 3 次物理排名为[12,13,15],3 次历史排名为[11,10,11],得出 T 值小于 0.1,说明两次成绩近似详见数据集)
1.1 不趋近(说明物理/历史有一科成绩好,就判物理/历史 3 次考试方差和平均排名)
1.1.1 物理排名数值小于历史,且物理方差小于等于历史;推荐物理
1.1.2 物理排名数值小于历史,且物理方差大于历史(物理科目好,但是物理成绩不稳定,需要进行趋向检测)
1.1.2.1 物理 a 值和历史 a 值都大于 0(说明物理和历史都呈现退步趋势)
1.1.2.1.1 判断物理/历史 a 值大小,若物理 a>历史 a,说明物理退步比历史大(且上一个条件已经说明物理不稳定),推荐历史
1.1.2.1.2 同理物理 a<历史 a,推荐物理
1.1.2.2 物理 a 值和历史 a 值都小于 0(说明物理和历史都呈现进步趋势)
1.1.2.2.1 判断物理/历史 a 值大小,若物理 a>历史 a,说明物理进步不如比历史明显(且上一个条件已经说明物理不稳定),推荐历史
1.1.2.2.2 同理物理 a<历史 a,推荐物理
1.1.2.3 物理 a 值和历史 a 值,一个大于 0 一个小于 0(推荐小于 0 的科目,因为 a为负说明呈进步态)
1.1.2.4 物理 a 值和历史 a 值都等于 0(这里不会出现这种情况,在趋近判断中已经分过去了)
1.1.3 物理排名数值大于历史,且物理方差小于等于历史推荐历史
1.1.4 物理排名数值大于历史,且物理方差大于历史(历史科目好,但是历史成绩不稳定,需要进行趋向检测)
1.1.4.1 物理 a 值和历史 a 值都大于 0(说明物理和历史都呈现退步趋势)
1.1.4.1.1 判断物理/历史 a 值大小,若物理 a>历史 a,说明历史退步比物理大(且上一个条件已经说明历史不稳定),推荐物理。
1.1.4.1.2 同理物理 a<历史 a,推荐物理
1.1.4.2 物理 a 值和历史 a 值都小于 0(说明物理和历史都呈现进步趋势)
1.1.4.2.1 判断物理/历史 a 值大小,若物理 a>历史 a,说明历史进步不如比物理明显(且上一个条件已经说明历史不稳定),推荐物理
1.1.4.2.2 同理物理 a<历史 a,推荐物理
1.1.4.3 物理 a 值和历史 a 值,一个大于 0 一个小于 0(推荐小于 0 的科目,因为 a为负说明呈进步态)
1.1.4.4 物理 a 值和历史 a 值都等于 0(这里不会出现这种情况,在趋近判断中已经分过去了)
1.1.5 .物理排名数值等于物理(这里不会出现这种情况,在趋近判断中已经分过去了)

2)趋近(说明物理/历史成绩水平差不多)
同理判断物理/历史趋势,决定推荐存在相同情况那么。两个一起推荐,或者不显示(出现概率为 3 的人数次方分之一)特殊情况均不进行推荐,推荐位填写为空:
1.任意一科目缺考 2 次及以上
2.任意一科目成绩排名每次相同情况
3.a = 0 情况

五、Python代码及Java

1.Python 代码

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 19 09:45:32 2019

@author: zj1993
"""

import pandas as pd
import numpy as np
import math
from scipy import stats


path = r''

def read_excel():
    
    global data
    
#    data = pd.read_excel(path)
    data = [[587,592,576,553],[567,315,415,578],[566,653,625,523]]
    
def logic_modle(score):
    
    #构造考试时间轴
    x1 = []
    
    for i in range(1,len(score)+1):
        x1.append(i)
    
    x = np.array(x1)
    y = np.array(score)
    
    #计算拟合系数
    poly = np.polyfit(x, y, deg=1)
#    print("使用numpy库:a:" + str(poly[0]) + ",b:" + str(poly[1]))
    
    #输出拟合公式预测下一次分数
    z = poly[0]*(len(score)+1)+poly[1]
#    print(z)
    
    #计算标准误
    std=np.std(score)
    standard_error=std/math.sqrt(len(score))
    
    #预测高考分数得分区间
    low = z-standard_error
    high = z+standard_error

    #稳定性计算
    stu_std = np.std(score)
    if stu_std>=80:
        stu_std_up = '不稳定'
        
        up = '-'
    else:
        stu_std_up = '稳定'
        
        #判断上升下降趋势
        if poly[0] > 0:
            up = '上升趋势'
        elif poly[0] < 0:
            up = '下降趋势'
        else:
            up = '无趋势'
#    print(up)

    #构造输出函数
    global data2
    data2 = []
    data2.append(stu_std_up)
    data2.append(up)
    data2.append(round(z,0))
    data2.append(str(round(low,0)) + '~' +  str(round(high,0)))
    print(data2)
    return data2

def do_logic_modle():

    data3 = []
     #为每个同学制定独立的拟合模型
    for i in range(len(data)):
            
#        data1 = data[['第一次成绩','第二次成绩','第三次成绩','第四次成绩']].iloc[i].tolist() #tolist转为数组
        data1 = data[i]
        
        logic_modle(data1)
        
        data1.extend(data2)
        
        data3.append(data1)
    
read_excel()
do_logic_modle()

Java 代码

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值