news 2026/9/12 21:05:53

基于Hadoop的房价数据分析系统:从爬虫到可视化完整实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Hadoop的房价数据分析系统:从爬虫到可视化完整实现

每当看到“基于 Hadoop 的房价数据分析系统”这类题目,很多同学第一反应是“技术栈会不会太多、Hold 不住”。实际上,只要把数据链路梳理清楚,这个项目可以说是性价比很高的毕设选题:既有 Python 爬虫做数据采集,又有 Hadoop/Hive 做离线存储与分析,最后还有 Vue+ECharts 做可视化展示,技术覆盖面广,而且每一层都有成熟的生态支持。

本文我打算按照真实项目的推进顺序来写,从系统整体架构、环境准备、数据采集、Hadoop 分析,到 Vue 可视化页面,最后是常见问题与工程建议。整套流程都配有可复制代码,希望能让正在做毕设、课程设计或想入门大数据开发的同学少走弯路。

1. 系统背景与技术架构

1.1 这个系统解决什么问题

房价数据的特点是:来源分散、字段不统一、数据量持续增长。如果只靠 Excel 手工整理,很难完成城市间对比、价格趋势分析、户型分布统计这类多维度观察。另一方面,爬虫采集到的原始数据往往包含重复记录、房源状态过期、价格异常值等问题,需要一套“采集 -> 存储 -> 清洗 -> 分析 -> 可视化”的完整流程。

基于 Hadoop 的房价数据分析系统,正好对应了这一整套流程:

  • Python 爬虫负责从公开房产网站采集房源信息。
  • Hadoop HDFS负责原始数据与结果数据的分布式存储。
  • Hive / MapReduce负责数据清洗和离线统计分析。
  • Vue + ECharts负责把统计结果展示成图表,方便查看结论。

这个项目形式比较接近企业中“数据仓库 + 报表平台”的简化版,非常适合作为毕业设计或大数据课程综合实践。

1.2 技术栈选择与模块划分

从模块角度拆分,系统可以分成以下 4 个部分:

模块技术选型核心职责
数据采集模块Python、requests、BeautifulSoup爬取网页、解析房源字段、保存 CSV
数据存储模块Hadoop HDFS存储原始 CSV 文件、分析结果
数据分析模块Hive、MapReduce数据清洗、价格统计、区域排行、趋势分析
可视化模块Vue、ECharts、axios读取接口数据,渲染图表页面

所有模块之间通过“数据文件”和“统计结果表”衔接,耦合度低,适合分阶段开发。即使某一层出现问题,也不会影响其他模块的调试。

1.3 为什么选择 Hadoop 而不是 MySQL

这里并不是说 MySQL 不好,而是侧重点不同。如果数据量在百万条以下,MySQL 完全够用。但如果想体现大数据处理能力、练习分布式计算生态,或者数据量达到千万级别后需要离线批量分析时,Hadoop 体系更适合:

  • HDFS 可以横向扩展,存大量原始日志和爬虫文件。
  • Hive 用类 SQL 语法做离线分析,上手成本低。
  • MapReduce 可以完成复杂的清洗逻辑,比如去重、排序、聚合。

对于毕设或者简历项目来说,Hadoop 生态的“可讲深度”也更高,答辩时可以围绕“分布式存储、数据倾斜、离线计算、任务调度”展开。

2. 环境准备与版本规划

2.1 开发环境建议

整套系统涉及 Python、Hadoop、Vue,环境搭建要提前规划。下面是我推荐的组合(版本可根据你本机情况调整,不必完全相同):

  • 操作系统:Windows 10/11,或 Linux 虚拟机(CentOS 7 / Ubuntu 20.04)
  • Python:3.8 或 3.9 均可,推荐用 Anaconda 管理环境
  • Hadoop:2.10.x 或 3.x,伪分布式模式
  • Hive:3.1.x(需要先安装 MySQL 作为元数据库,也可用 Derby 临时测试)
  • JDK:1.8,Hadoop 对 JDK 版本敏感
  • Node.js:14 以上
  • Vue CLI:4.x 或 5.x
  • IDE:PyCharm(写爬虫)、IDEA(写 Java 代码)、VS Code(写 Vue)

注意:如果你使用的是 Hadoop 3.x,请搭配 JDK 1.8 或 JDK 11;不要随意使用 JDK 17,部分组件存在兼容问题。

2.2 Hadoop 伪分布式搭建要点

伪分布式是学习阶段最省资源的方式,一台机器上同时启动 NameNode、DataNode 等进程。核心配置如下。

先准备core-site.xml

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop/tmp</value> </property> </configuration>

再准备hdfs-site.xml

<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///usr/local/hadoop/tmp/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///usr/local/hadoop/tmp/datanode</value> </property> </configuration>

启动 HDFS 之前需要先格式化 NameNode:

hdfs namenode -format start-dfs.sh jps

如果 jps 能看到 NameNode、DataNode、SecondaryNameNode 三个进程,说明伪分布式环境已经正常。

2.3 项目整体目录规划

建议把代码分成独立目录维护,避免所有文件堆在根目录。下面是一个参考结构:

house-price-analysis/ ├── crawler/ │ ├── crawl_house.py │ ├── parser.py │ └── data/ │ └── house.csv ├── hadoop/ │ ├── upload_to_hdfs.sh │ ├── hive_analysis.sql │ └── mapreduce/ │ └── HousePriceMR.java ├── server/ │ └── api/ │ └── house_api.py └── web/ └── house-visualization/

这样分类的好处是:爬虫、大数据分析、后台接口、前端展示彼此独立,后期哪一块出问题就单独处理哪一块。

3. Python 爬虫:获取房价原始数据

3.1 爬虫设计思路

房价数据的来源一般是链家、安居客、贝壳等网站。这里以链家二手房为例,爬虫需要完成这几步:

  1. 根据城市和页码构造 URL。
  2. 用 requests 请求页面,设置合理的 User-Agent。
  3. 用 BeautifulSoup 解析房源列表项。
  4. 提取小区名称、区域、户型、面积、朝向、价格、单价等字段。
  5. 保存到 CSV 文件,作为 Hadoop 的输入数据。

需要注意:链家网站有反爬机制,爬取频率不要太高,建议在请求之间设置随机延时,并且不要并发请求太多。这里只做学习演示,不针对任何网站做高并发采集。

3.2 爬虫核心代码

下面是一个简化但可运行的爬虫示例,用于抓取二手房列表页的基础字段。

# 文件路径:crawler/crawl_house.py import csv import random import time import requests from bs4 import BeautifulSoup HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/91.0.4472.124 Safari/537.36", "Accept-Language": "zh-CN,zh;q=0.9" } def fetch_page(city, page): """请求链家二手房列表页""" url = f"https://{city}.lianjia.com/ershoufang/pg{page}/" resp = requests.get(url, headers=HEADERS, timeout=10) resp.encoding = "utf-8" return resp.text def parse_house_list(html): """解析房源列表,返回字典列表""" soup = BeautifulSoup(html, "html.parser") items = soup.select(".sellListContent li .info") result = [] for item in items: title = item.select_one(".title a") house_info = item.select_one(".address .houseInfo") total_price = item.select_one(".totalPrice span") unit_price = item.select_one(".unitPrice span") if not title or not house_info or not total_price: continue info_text = house_info.get_text(strip=True) # info_text 示例:2室1厅 | 89.63平米 | 南 北 | 精装 parts = [p.strip() for p in info_text.split("|")] result.append({ "title": title.get_text(strip=True), "community": item.select_one(".communityName") is not None, "house_type": parts[0] if len(parts) > 0 else "", "area": parts[1] if len(parts) > 1 else "", "orientation": parts[2] if len(parts) > 2 else "", "total_price": total_price.get_text(strip=True), "unit_price": unit_price.get_text(strip=True).replace("元/平", "") if unit_price else "" }) return result def save_to_csv(records, file_path): """保存到 CSV 文件""" if not records: return with open(file_path, "a", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=records[0].keys()) if f.tell() == 0: writer.writeheader() writer.writerows(records) if __name__ == "__main__": output = "data/house.csv" for page in range(1, 6): # 抓取前 5 页,可按需修改 html = fetch_page("sh", page) data = parse_house_list(html) save_to_csv(data, output) print(f"第 {page} 页抓取完成,共 {len(data)} 条记录") time.sleep(random.uniform(1, 3))

3.3 爬虫运行说明

运行爬虫前先安装依赖:

pip install requests beautifulsoup4

然后执行:

python crawler/crawl_house.py

完成后,data/house.csv中会写入类似以下格式的数据:

title,house_type,area,orientation,total_price,unit_price 建工小区,2室1厅,89.63平米,南 北,585,65400 阳光花园,3室2厅,120.5平米,南,720,59800

字段说明:

  • title:房源标题
  • house_type:户型
  • area:建筑面积
  • orientation:朝向
  • total_price:总价(万元)
  • unit_price:单价(元/平方米)

3.4 爬虫注意事项

  • 爬虫只用于学习和个人研究,不要对目标网站造成压力。
  • 如果遇到访问被拒、验证码等情况,建议降低爬取频率或改用本地数据测试。
  • 解析规则如果失效,通常是网页结构调整,需要检查选择器是否正确。

4. Hadoop 数据分析:从 HDFS 到 Hive 离线统计

4.1 上传数据到 HDFS

爬虫产生的 CSV 文件是统计分析的数据源。我们首先要创建 HDFS 目录并上传文件。

hdfs dfs -mkdir -p /house/input hdfs dfs -put crawler/data/house.csv /house/input/ hdfs dfs -ls /house/input/

上传完成后,可以通过 HDFS Web 界面确认文件是否存在,默认地址是http://localhost:9870

4.2 使用 Hive 创建外部表

在 Hadoop 生态中,Hive 的优势是可以用 SQL 做数据仓库分析。我们先把 CSV 数据映射成 Hive 表。这里使用外部表,删除表时不会影响 HDFS 中的数据文件,比较安全。

-- 文件路径:hadoop/hive_analysis.sql CREATE DATABASE IF NOT EXISTS house_db; USE house_db; CREATE EXTERNAL TABLE IF NOT EXISTS house_info ( title STRING, community STRING, house_type STRING, area STRING, orientation STRING, total_price DOUBLE, unit_price DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/house/input' TBLPROPERTIES ("skip.header.line.count"="1");

这里有几个关键点:

  • FIELDS TERMINATED BY ','表示字段分隔符是英文逗号。
  • skip.header.line.count"=1用来跳过 CSV 表头行。
  • LOCATION指定 HDFS 目录,内部表会移动数据,这里用外部表更稳妥。

4.3 数据清洗

原始数据可能会有空值、重复数据、异常价格。可以通过 Hive SQL 创建一张清洗后的表。

USE house_db; CREATE TABLE house_clean AS SELECT title, house_type, area, orientation, total_price, unit_price FROM house_info WHERE total_price > 0 AND unit_price > 5000 AND unit_price < 200000 AND area IS NOT NULL AND area != '' GROUP BY title, house_type, area, orientation, total_price, unit_price;

这一步做了两件事:

  1. 过滤明显异常的数据,比如总价小于 0、单价异常偏高或偏低。
  2. GROUP BY去掉完全重复的记录。

4.4 统计分析 SQL

清洗完成后,就可以做各种统计了。下面几个查询是比较典型的房价分析需求。

4.4.1 按户型统计平均总价
USE house_db; SELECT house_type, COUNT(*) AS cnt, ROUND(AVG(total_price), 2) AS avg_total_price, ROUND(AVG(unit_price), 2) AS avg_unit_price FROM house_clean GROUP BY house_type ORDER BY cnt DESC;

这个统计可以帮我们回答“哪种户型供应量最大”“哪种户型均价最高”。

4.4.2 按面积区间统计价格水平
USE house_db; SELECT CASE WHEN area < 50 THEN '50平以下' WHEN area >= 50 AND area < 90 THEN '50-90平' WHEN area >= 90 AND area < 140 THEN '90-140平' ELSE '140平以上' END AS area_range, COUNT(*) AS cnt, ROUND(AVG(total_price), 2) AS avg_total_price FROM house_clean GROUP BY CASE WHEN area < 50 THEN '50平以下' WHEN area >= 50 AND area < 90 THEN '50-90平' WHEN area >= 90 AND area < 140 THEN '90-140平' ELSE '140平以上' END ORDER BY cnt DESC;

通过这个结果,可以看到不同面积段房源的数量分布和价格差异,在可视化页面中很适合用饼图或柱状图展示。

4.4.3 输出统计结果

为了方便 Vue 后端接口读取,可以把统计结果导出到 HDFS 目录,或者直接查询后由后端连接 Hive 获取。这里推荐一种简单方式:使用 Hive 查询结果写入到 HDFS 的指定目录。

INSERT OVERWRITE DIRECTORY '/house/output/avg_price' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT house_type, COUNT(*) AS cnt, ROUND(AVG(total_price), 2) AS avg_total_price FROM house_clean GROUP BY house_type;

然后通过 HDFS 命令查看输出:

hdfs dfs -ls /house/output/avg_price/ hdfs dfs -cat /house/output/avg_price/000000_0

4.5 使用 MapReduce 做补充分析

Hive 能覆盖大部分统计需求,但如果你想在答辩中展示“我真的理解 Hadoop 计算原理”,最好再写一个简单的 MapReduce 程序。下面以统计“各朝向房源数量”为例。

// 文件路径:hadoop/mapreduce/HousePriceMR.java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; public class HousePriceMR { public static class OrientationMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text orientation = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { // CSV 中第 5 列是朝向,下标从 0 开始,所以 index = 4 String[] fields = value.toString().split(","); if (fields.length >= 5 && !fields[4].isEmpty()) { orientation.set(fields[4]); context.write(orientation, one); } } } public static class OrientationReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "house orientation count"); job.setJarByClass(HousePriceMR.class); job.setMapperClass(OrientationMapper.class); job.setCombinerClass(OrientationReducer.class); job.setReducerClass(OrientationReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }

编译和运行命令如下:

javac -cp $(hadoop classpath) HousePriceMR.java jar cf house-mr.jar HousePriceMR*.class hadoop jar house-mr.jar HousePriceMR /house/input/house.csv /house/output/orientation_count

运行完成后,查看结果文件:

hdfs dfs -cat /house/output/orientation_count/part-r-00000

这里要提醒一点:CSV 中如果某个字段内部包含逗号,简单split(",")会解析错误。演示代码为了简洁采用简单切分,实际项目中建议用opencsv或先通过 Hive 预处理成规范格式。

5. Vue 可视化分析与接口对接

5.1 后端接口设计

可视化页面需要的数据,最好由后端 API 统一提供。可以使用 Python Flask 或 FastAPI 写一个轻量接口,查询 Hive 结果或读 HDFS 输出文件并转成 JSON。

下面是基于 Flask 的简单接口示例:

# 文件路径:server/api/house_api.py import json from flask import Flask, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) # 模拟数据,实际项目中可以读取 HDFS 结果文件或查询 Hive with open("mock_data.json", "r", encoding="utf-8") as f: mock_data = json.load(f) @app.route("/api/house/avg_price", methods=["GET"]) def avg_price(): """按户型返回平均总价""" return jsonify({ "code": 0, "data": mock_data["avg_price"] }) @app.route("/api/house/area_range", methods=["GET"]) def area_range(): """按面积区间返回房源数量分布""" return jsonify({ "code": 0, "data": mock_data["area_range"] }) @app.route("/api/house/orientation", methods=["GET"]) def orientation(): """按朝向返回房源数量""" return jsonify({ "code": 0, "data": mock_data["orientation"] }) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)

实际开发中,你可以通过hdfs dfs -cat读取结果文件,也可以用pyhive直接查询 Hive 表。为了演示,这里先用 mock 数据保证前端流程跑通。

5.2 创建 Vue 项目

如果你还没有安装 Vue CLI,先执行:

npm install -g @vue/cli vue create house-visualization

进入项目目录并安装 ECharts 和 axios:

cd house-visualization npm install echarts axios

5.3 编写可视化页面

src/views/Dashboard.vue中,我们放置两个图表:按户型统计平均总价柱状图、按面积区间统计房源数量饼图。

<!-- 文件路径:web/house-visualization/src/views/Dashboard.vue --> <template> <div class="dashboard"> <h2>房价数据可视化分析</h2> <div class="chart-row"> <div ref="barChart" class="chart"></div> <div ref="pieChart" class="chart"></div> </div> </div> </template> <script> import * as echarts from "echarts"; import axios from "axios"; export default { name: "Dashboard", data() { return { avgPriceData: [], areaRangeData: [], }; }, mounted() { this.fetchData(); }, methods: { async fetchData() { try { const avgRes = await axios.get("http://localhost:5000/api/house/avg_price"); const areaRes = await axios.get("http://localhost:5000/api/house/area_range"); this.avgPriceData = avgRes.data.data; this.areaRangeData = areaRes.data.data; this.initBarChart(); this.initPieChart(); } catch (error) { console.error("数据加载失败", error); } }, initBarChart() { const chart = echarts.init(this.$refs.barChart); chart.setOption({ title: { text: "户型平均总价" }, tooltip: {}, xAxis: { type: "category", data: this.avgPriceData.map((item) => item.house_type), }, yAxis: { type: "value" }, series: [ { name: "平均总价(万元)", type: "bar", data: this.avgPriceData.map((item) => item.avg_total_price), itemStyle: { color: "#5470c6" }, }, ], }); }, initPieChart() { const chart = echarts.init(this.$refs.pieChart); chart.setOption({ title: { text: "面积区间房源占比" }, tooltip: { trigger: "item" }, series: [ { name: "房源数量", type: "pie", radius: "55%", data: this.areaRangeData.map((item) => ({ name: item.area_range, value: item.cnt, })), }, ], }); }, }, }; </script> <style scoped> .dashboard { padding: 20px; } .chart-row { display: flex; gap: 20px; flex-wrap: wrap; } .chart { width: 46%; height: 400px; border: 1px solid #eee; border-radius: 8px; padding: 10px; } </style>

5.4 配置路由并启动

src/router/index.js中添加路由:

import Vue from "vue"; import VueRouter from "vue-router"; import Dashboard from "../views/Dashboard.vue"; Vue.use(VueRouter); const routes = [ { path: "/", name: "Dashboard", component: Dashboard, }, ]; const router = new VueRouter({ mode: "history", routes, }); export default router;

然后启动前端项目:

npm run serve

浏览器访问http://localhost:8080,如果 Flask 后端已经启动,页面会显示户型平均总价柱状图和面积区间占比饼图。

5.5 前后端联调注意点

跨域问题是最常见的坑。Flask 后端已经通过flask_cors允许跨域请求。如果你用的是其他后端框架,也需要配置对应的跨域支持。

如果页面请求接口时报ERR_CONNECTION_REFUSED,先确认 Flask 服务是否启动、端口是否为 5000。如果前端部署在其他机器,需要把localhost改成后端实际 IP。

6. 常见问题与排查思路

6.1 HDFS/Java 环境相关

问题现象常见原因解决思路
jps看不到 NameNode格式化目录不一致或未启动成功检查配置路径,删除 tmp 目录后重新格式化
Java 版本过高导致 Hadoop 启动失败Hadoop 与 JDK 版本不兼容切换到 JDK 1.8
上传文件到 HDFS 报权限不足使用 root 用户导致安全校验失败创建 Hadoop 用户并授权,或修改 HDFS 权限配置
Hive 启动报元数据错误元数据库连接配置错误确认 MySQL JDBC 驱动与连接信息

6.2 爬虫相关

问题现象常见原因解决思路
请求返回 403请求头不完整或频繁访问触发反爬补充 User-Agent、Cookie,增加延时
解析结果为空网站页面结构变化打印 HTML 片段,更新选择器
保存 CSV 出现中文乱码编码格式问题使用utf-8-sig编码写入

6.3 Vue 与接口相关

问题现象常见原因解决思路
页面图表不显示DOM 初始化或数据格式问题检查请求是否成功,打印数据观察结构
跨域请求被拦截后端未开启 CORS配置 CORS 中间件或代理
ECharts 容器宽度为 0图表初始化早于布局完成mounted之后初始化,或使用nextTick

7. 最佳实践与答辩加分项

7.1 数据分层设计

不要把所有数据都混在一张表里。建议参考数仓分层思路:

  • ODS 层:原始爬虫数据。
  • DWD 层:清洗、去重后的明细数据。
  • ADS 层:按业务需求聚合出的统计结果。

在项目中体现分层思想,能让系统维护性更好,也是答辩中很加分的点。

7.2 把“数据倾斜”准备好

在 Hive 做GROUP BY时,如果某个 key 数据量过大,会产生数据倾斜。比如某个热门小区的房源异常多,导致 Reduce 任务处理缓慢。可以提前了解常见的解决思路:

  • 加随机前缀打散 key。
  • 使用MAPJOIN优化小表关联。
  • 调整 Reduce 并行度。

不需要实际操作得很深,但能在答辩中说出来,说明你真的理解分布式计算的瓶颈。

7.3 安全与权限意识

爬虫采集数据时,要遵守网站 robots 协议,不要高频访问;数据存储和分析时,不要涉及隐私信息。如果是模拟项目,建议对数据做脱敏处理,不要展示真实手机号、业主姓名等字段。

7.4 代码规范与文档

为了让答辩更顺利,建议做好三件事:

  1. 在 README 中写清楚环境版本、启动步骤、目录结构。
  2. 把每个模块的输入输出说清楚,比如“爬虫输出 CSV -> HDFS -> Hive 表 -> 前端 JSON”。
  3. 准备一份常见问题文档,记录自己做项目过程中遇到并解决的报错。

毕业设计本质上是“完整交付一个技术项目”,不是比谁用的技术新,而是比谁把流程讲得清楚、把问题解决得彻底。把上面这些细节做到,你的系统已经比大多数演示型项目更完整。

本文从数据采集、Hadoop 存储分析、Vue 可视化到工程化建议,完整梳理了房价数据分析系统的实现路径。建议你拿到代码后,先按环境说明本地跑通一遍,再根据自己城市、网站、数据量做调整。做成自己的项目后,无论答辩还是将来写简历,都会更有底气。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 6:23:13

江西高考冲刺班费用

江西高考冲刺班费用多少&#xff1f;南昌金博教育全日制集训费用详解 南昌金博教育是南昌本地一所专注于高三全日制冲刺集训的学校&#xff0c;面向江西全省招收应届高三学生及复读生&#xff0c;采用食宿一体、封闭管理模式进行集中备考。随着2024年高考临近&#xff0c;许多家…

作者头像 李华
网站建设 2026/9/8 12:16:09

Leet code 精髓记录

1934.确认率&#xff08;avg的妙用&#xff09;表: Signups-------------------------- | Column Name | Type | -------------------------- | user_id | int | | time_stamp | datetime | -------------------------- User_id是该表的主键。 每一行都…

作者头像 李华
网站建设 2026/9/8 23:52:17

零基础也能玩转神经网络:可视化交互平台让机器学习不再难

简介&#xff1a;这是一套面向零基础学习者与教育工作者的可视化机器学习入门教学平台&#xff0c;专为降低机器学习学习门槛而设计&#xff0c;无需数学推导与编程经验即可直观理解算法原理、创建并训练神经网络模型&#xff0c;适用于课堂教学演示、自学实践与概念验证。资源…

作者头像 李华
网站建设 2026/9/8 18:47:49

React Native 八股文:从桥到新架构的系统设计指南

很多人一看到“React Native 八股文”这几个字&#xff0c;脑子里浮现的就是题海和背诵&#xff0c;但我在移动端团队和前端团队都面试过不少候选人&#xff0c;一个很明显的感受是&#xff1a;能把八股聊好的人&#xff0c;不是在背书&#xff0c;而是在讲系统设计。React Nat…

作者头像 李华