PHP和MySQL当中遇到的问题

img


怎么在用户选择一只股票后,和数据库当中的其他股票进行相似度比较并输出前两项?


function cosine_similarity($a,$stock ) {
    $dot_product = 0.0;
    $magnitude1 = 0.0;
    $magnitude2 = 0.0;
    foreach ($a as $key => $value) {
        $magnitude1 += $value * $value;
        if (isset($stock[$key])) {
            $dot_product += $value * $stock[$key];
        }
    }
    foreach ($stock as $key => $value) {
        $magnitude2 += $value * $value;
    }
    if ($magnitude1 == 0.0 || $magnitude2 == 0.0) {
        return 0.0;
    }
    return $dot_product / (sqrt($magnitude1) * sqrt($magnitude2));
}
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/838462
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【数据库】Mysql 确定数据集位置与安装位置,并自定义修改
  • 除此之外, 这篇博客: PHP进阶面试题中的 如何实现 MySQL 的读写分离? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去。

  • 您还可以看一下 黄菊华老师的基于php和mysql的校园新闻信息发布管理系统 毕业设计毕设源码教程课程中的 校园新闻信息发布管理系统-发布演示小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对该问题的解决方案:

    1.首先需要确定相似度算法,可以选择余弦相似度等算法。假设选择余弦相似度算法,其计算方法为:将两个向量进行内积,然后除以两个向量的模,得到的结果就是它们之间的余弦相似度。

    2.在数据库中,将数据按照需要计算相似度的特征值(如价格、市盈率等)分列存储,方便计算。

    3.根据用户选择的股票,从数据库中读取该股票所对应的特征值,将原数据向量和该向量进行余弦相似度计算,得到所有其他股票与该股票的相似度。

    4.将相似度从高到低排序,并选取前两项。

    5.将筛选后的结果返回给用户。

    具体代码实现可参考以下示例:

    // 定义计算余弦相似度的函数
    function cosineSimilarity($vector1, $vector2) {
        $dotProduct = 0.0;
        $n1 = 0.0;
        $n2 = 0.0;
        foreach ($vector1 as $key => $value) {
            $n1 += $value * $value;
            $dotProduct += $value * $vector2[$key];
        }
        foreach ($vector2 as $key => $value) {
            $n2 += $value * $value;
        }
        if ($n1 == 0.0 || $n2 == 0.0) {
            return 0.0;
        } else {
            return $dotProduct / (sqrt($n1) * sqrt($n2));
        }
    }
    
    // 连接数据库,查询用户选择的股票的特征值
    $pdo = new PDO("mysql:host=localhost;dbname=test", "root", "password");
    $stock = "股票A";
    $stmt = $pdo->prepare("SELECT price, pe_ratio, pb_ratio FROM stocks WHERE name = ?");
    $stmt->execute([$stock]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $vector1 = array_values($row);
    
    // 计算所有其他股票与该股票的相似度,并排序
    $similarities = array();
    $stmt = $pdo->query("SELECT name, price, pe_ratio, pb_ratio FROM stocks WHERE name != '$stock'");
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $vector2 = array_values($row);
        $similarity = cosineSimilarity($vector1, $vector2);
        $similarities[$row["name"]] = $similarity;
    }
    arsort($similarities);
    
    // 选取相似度最高的前两项
    $i = 0;
    $results = array();
    foreach ($similarities as $name => $similarity) {
        $results[] = array("name" => $name, "similarity" => $similarity);
        $i++;
        if ($i == 2) {
            break;
        }
    }
    
    // 输出结果
    foreach ($results as $result) {
        echo $result["name"] . ": " . $result["similarity"] . "\n";
    }
    

    需要注意的问题:

    1.数据库中的数据需要按照股票名称和特征值对应存储,可以使用行存储或者列存储方式。

    2.需要选用合适的相似度算法,余弦相似度是其中之一。

    3.需要对计算相似度涉及到的数据进行预处理,如取对数等操作,以确保计算结果的正确性。

    4.为了提高查询效率,可以在数据库中建立相应的索引。

    5.在设计数据表时需要注意数据类型的选择,以及字段宽度和精度的设置。