PHP和MySQL当中遇到的问题

img

怎么在用户输入之后和MySQL数据库当中的其他股票进行相似度比较呢?我现在已经实现了将数据库当中的数据转化为数据,那怎么将用户输入的数据转化为数组呢?并且调用函数进行相似度比较

<?php
  $mysqli=new mysqli('localhost','root','123456','gupiaoshuju');
  $result =$mysqli->query("SELECT * FROM stock");
  $stock = array();
  while ($row =$result->fetch_assoc()) {
     $stock[] = $row;
  }
 print_r($stock);

$hangye = $_POST['hangye'];
$meigushouyi=$_POST['meigushouyi'];
$yingyezongshouru=$_POST['yingyezongshouru'];
$jinglirun=$_POST['jinglirun'];
$meigusjingzichan=$_POST['meigusjingzichan'];
$jingzichansyl=$_POST['jingzichansyl'];
$xsmll=$_POST['xsmll'];

$user_array=explode($hangye,$meigushouyi,$yingyezongshouru,$jinglirun,$meigusjingzichan,$jingzichansyl,$xsmll);
$user_input = explode(", ", $_POST['input']); // 从表单中获取用户输入
$results = array();
foreach ($stocks as $stock) {
    $data = explode(", ", $stock['data']);
    $similarity = cosine_similarity($user_input, $data);
    $results[$stock['name']] = $similarity;
}
 
 
//计算余弦相似度函数
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));
}
 
// 计算第一个数组与其他数组的相似度,并将结果保存在 $similarities 数组中
$similarities = array();
$user_array = $vectors[0];
foreach ($vectors as $key => $stock) {
    $similarity = cosine_similarity($user_array, $stock);
    $similarities[$key] = $similarity;
}
 
// 对相似度进行排序,并输出前两项
arsort($similarities);
$top_similarities = array_slice($similarities, 0, 2, true);
foreach ($top_similarities as $key => $similarity) {
    echo "Array $key: similarity = $similarity\n";
}
 
 
  1. 将用户输入的数据存储在一个关联数组 $user_input 中,其中每个键表示一个参数(例如 "行业"、"每股收益"、"营业总收入" 等),而对应的值则表示用户输入的该参数的值。
  2. 声明一个新的关联数组 $stock_data,用于存储您的数据集中每只股票的参数值。
  3. 针对您的数据集中的每一支股票,将其参数值存储在 $stock_data 中,使用与 $user_input 相同的键值对应。
  4. 调用 cosine_similarity 函数,将 $user_input 和 $stock_data 作为参数传递给该函数。
  5. 根据返回的相似度值,可以判断出输入数据 $user_input 与数据集中哪些股票最为相似。

以下是一个示例代码:

// 用户输入的数据
$user_input = array(
    "行业" => "医疗器械",
    "每股收益" => 0.78,
    "营业总收入" => 20000000,
    "净利润" => 5000000,
    "每股净资产" => 2.34,
    "净资产收益率" => 0.12,
    "销售毛利率" => 0.45
);

// 假设您的数据集中包含三只股票,分别是 a、b 和 c。
// 每支股票都有与用户输入相同的参数,这里只列出部分参数。
$stock_data = array(
    "a" => array(
        "行业" => "医疗器械",
        "每股收益" => 0.82,
        "营业总收入" => 18000000,
        "净利润" => 4500000,
        "每股净资产" => 2.20,
        "净资产收益率" => 0.10,
        "销售毛利率" => 0.43
    ),
    "b" => array(
        "行业" => "医疗器械",
        "每股收益" => 0.76,
        "营业总收入" => 21000000,
        "净利润" => 5500000,
        "每股净资产" => 2.42,
        "净资产收益率" => 0.14,
        "销售毛利率" => 0.48
    ),
    "c" => array(
        "行业" => "生物制药",
        "每股收益" => 0.85,
        "营业总收入" => 25000000,
        "净利润" => 6000000,
        "每股净资产" => 2.55,
        "净资产收益率" => 0.16,
        "销售毛利率" => 0.51
    )
);

// 计算与用户输入最为相似的股票
$highest_similarity = 0;
$most_similar_stock = "";
foreach ($stock_data as $stock_name => $stock_parameters) {
    $similarity = cosine_similarity($user_input, $stock_parameters);
    if ($similarity > $highest_similarity) {
        $highest_similarity = $similarity;
        $most_similar_stock = $stock_name;
    }
}

echo "与您的输入最为相似的股票是 $most_similar_stock,相似度为 $highest_similarity。";