繁体   English   中英

我集合中每个人的多条数据线

[英]multiple data lines for each person in my set

因此,基本上,我有一个与此类似的数据集:

人|类|分数

大卫(Comp Science),A
大卫,英语,乙
大卫,化学,A
劳拉,化学,A
亨利(英语)D
亨利,法语,A
亨利,艺术,B
克拉拉(Comp Science),B
克拉拉(英语)A

因此,这里的想法是,例如,我放入自己的场景,
我:
化学,B
英语,A
Comp Sci,B

如果查看数据集,您会发现我的课程与David最相似。 我希望我的程序将名称从最大到最小排序。 除了这种情况,大卫不是最相似的人。 实际上是克拉拉。 想法是这样的:Clara有两个与我的类完全相同的类。 大卫的班级都一样,但他的成绩略差一点。 因此,我不必担心达到这一点的数学运算,因为关于一个人的成绩是否更相关或班级数量的想法是正确的。

所以这是我的问题:我将如何在python中组织类似的东西进行机器学习? 如果每一行有一个名字,我会知道该怎么办,但是在这种情况下,一个人可以参加多个课程。 这些多次出现不是独立的事件。 我要记住的是,我希望程序根据给定学生与我的相似性来给予他们一定的帮助。 例如,我可以说:“因为克拉拉(Clara)与我有更多相似之处,所以当我点比萨时,她告诉我,她想要意大利辣香肠比亨利(Henry)建议的任何东西都更愿意让我订购意大利辣香肠,因为亨利(Henry)的口味不相似无论如何对我来说。但是,如果她喜欢意大利辣香肠,但我绝对讨厌意大利辣香肠(或者其他所有人都讨厌意大利辣香肠),那么我将完全无视她的要求。” 因此,我将根据它们的相似性添加加权的“分数”本身。

我还有两个问题:如何为人们处理一组关键字? 例如,对于每个班级学到的东西,我可以说“ David,comp sci,A,(时间复杂度,二叉树,if语句)”。 我想用它来找到哪个类别最匹配这些关键字。 因此,如果我问什么具有二叉树和时间复杂性,该程序将根据每个人的关键字吐出计算机科学知识。
另一个问题是,哪种算法最有效? 在我看来,决策树最适合我的情况,但我不确定。

这是一个基本的实现,展示了我在评论中所说的内容。 我留下关键字,解析结果,并作为练习向您扩展,提出您想要的任何问题,我将对此帖子进行任何详细的修订。

您可以对关键字进行完全相同的操作,如果您想保留它们或类,则可以这样做。 结果的进一步使用可以使用ML,但是我的直觉说那里仍然有更简单的方法。

另外,确定班级应有的确切值和等级是另一项任务。 这会严重影响结果。 在确定类或年级是否更重要时...这将在很大程度上取决于使用情况,您甚至可以根据需要使用“偏差滑块”对其进行更改。

这是一个相当强大的评分功能:

scores[name] += (2*(2-bias)) - (bias * abs(data_point[1] - pivot_point[1]))

import numpy as np

people = """David, Comp Sci, A
David, English, B
David, Chemistry, A
Laura, Chemistry, A
Henry, English, D
Henry, French, A
Henry, Art, B
Clara, Comp Sci, B
Clara, English, A
OrbDeceptionist, Chemistry, B
OrbDeceptionist, English, A
OrbDeceptionist, Comp Sci, B"""


def get_names(dataset):
    names = []

    for line in dataset.split('\n'):
        name = line.split(',')[0]
        if name not in names:
            names.append(name)

    return names


grade_table = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'F': 4}
def get_classes(dataset, person):
    classes = []

    for line in dataset.split('\n'):
        name, subject, grade = line.split(',')
        if name == person:
            classes.append((subject, grade_table[grade.strip(' ')]))

    return classes


def most_similar(dataset, pivot, bias=0.3):
    pivot_data = get_classes(dataset, pivot)

    scores = {}

    names = get_names(dataset)

    for name in names:
        person_data = get_classes(dataset, name)

        for pivot_point in pivot_data:
            for data_point in person_data:
                if data_point[0] == pivot_point[0]:
                    if name not in scores:
                        scores[name] = 0

                    scores[name] += (2*(2-bias)) - (bias * abs(data_point[1] - pivot_point[1]))

    scores.pop(pivot)
    # You don't want to round in your final version, this is just to make it cleaner to see for the example.
    for k, v in scores.items():
        scores[k] = round(v)

    return scores


print('High bias favors grades, low bias favors classes.')
for b in np.arange(0.0, 1.1, 0.1):
    print('bias:', b, "|", most_similar(people, "OrbDeceptionist", b))

结果:

High bias favors grades, low bias favors classes.
bias: 0.0 | {'Henry': 4.0, 'Laura': 4.0, 'Clara': 8.0, 'David': 12.0}
bias: 0.1 | {'Henry': 4.0, 'Laura': 4.0, 'Clara': 8.0, 'David': 11.0}
bias: 0.2 | {'Henry': 3.0, 'Laura': 3.0, 'Clara': 7.0, 'David': 10.0}
bias: 0.3 | {'Henry': 2.0, 'Laura': 3.0, 'Clara': 7.0, 'David': 9.0}
bias: 0.4 | {'Henry': 2.0, 'Laura': 3.0, 'Clara': 6.0, 'David': 8.0}
bias: 0.5 | {'Henry': 2.0, 'Laura': 2.0, 'Clara': 6.0, 'David': 8.0}
bias: 0.6 | {'Henry': 1.0, 'Laura': 2.0, 'Clara': 6.0, 'David': 7.0}
bias: 0.7 | {'Henry': 0.0, 'Laura': 2.0, 'Clara': 5.0, 'David': 6.0}
bias: 0.8 | {'Henry': -0.0, 'Laura': 2.0, 'Clara': 5.0, 'David': 5.0}
bias: 0.9 | {'Henry': -0.0, 'Laura': 1.0, 'Clara': 4.0, 'David': 4.0}
bias: 1.0 | {'Henry': -1.0, 'Laura': 1.0, 'Clara': 4.0, 'David': 3.0}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM