import gradio as gr import pandas as pd import numpy as np import matplotlib.pyplot as plt # Global variable to store history of attempts history = [] def predict_house_price(area): """Simple house price prediction based on area""" # Using the simple formula: price = 0.1 * area (as per your slides) price = 0.1 * area return float(price) def calculate_sse(x, y, m, b): """Calculate Sum of Squared Errors""" y_predicted = m * x + b sse = np.sum((y - y_predicted) ** 2) return sse def plot_regression(data, m, b): try: df = data if isinstance(data, pd.DataFrame) else pd.read_csv(data) df['X'] = pd.to_numeric(df['X']) df['Y'] = pd.to_numeric(df['Y']) sse = calculate_sse(df['X'], df['Y'], m, b) history.append({ 'm': m, 'b': b, 'sse': sse, 'color': plt.cm.rainbow(len(history) % 10 / 10) }) fig = plt.figure(figsize=(15, 6)) # First subplot - Regression lines ax1 = fig.add_subplot(121) ax1.scatter(df['X'], df['Y'], color='black', alpha=0.5, label='Data points') for i, attempt in enumerate(history): x_range = np.linspace(df['X'].min(), df['X'].max(), 100) y_line = attempt['m'] * x_range + attempt['b'] label = f"m={attempt['m']:.1f}, b={attempt['b']:.1f}" ax1.plot(x_range, y_line, color=attempt['color'], linewidth=2, label=f"Try {i+1}: {label}") ax1.set_xlabel('X') ax1.set_ylabel('Y') ax1.set_title('Linear Regression Attempts') ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # Second subplot - SSE values ax2 = fig.add_subplot(122) attempts = range(1, len(history) + 1) sse_values = [attempt['sse'] for attempt in history] colors = [attempt['color'] for attempt in history] ax2.scatter(attempts, sse_values, c=colors) ax2.plot(attempts, sse_values, 'gray', alpha=0.3) for i, (attempt, sse) in enumerate(zip(attempts, sse_values)): label = f"m={history[i]['m']:.1f}\nb={history[i]['b']:.1f}" ax2.annotate(label, (attempt, sse), xytext=(5, 5), textcoords='offset points') ax2.set_xlabel('Attempt Number') ax2.set_ylabel('Sum of Squared Errors') ax2.set_title('SSE for Each Attempt') ax2.grid(True, alpha=0.3) plt.tight_layout() plt.close() return fig except Exception as e: print(f"Error: {e}") return None def clear_history(): history.clear() return None # Create the Gradio interface with tabs with gr.Blocks() as app: gr.Markdown("# Linear Regression Learning Tools") with gr.Tabs(): # First Tab - House Price Prediction with gr.TabItem("House Price Predictor"): gr.Markdown(""" # House Price Predictor Enter the area of the house (in m²) to predict its price. Based on the simple model: Price = 0.1 × Area """) with gr.Row(): area_input = gr.Number( label="House Area (m²)", value=100 ) price_output = gr.Number( label="Predicted Price ($M)", value=None ) predict_button = gr.Button("Predict Price") predict_button.click( fn=predict_house_price, inputs=area_input, outputs=price_output ) # Example table gr.Markdown(""" ### Example Data Points: | Area (m²) | Price ($M) | |-----------|------------| | 100 | 10 | | 200 | 20 | | 300 | 30 | | 400 | 40 | | 500 | 50 | """) # Second Tab - Regression Playground with gr.TabItem("Understanding Squares Error"): gr.Markdown(""" # Understanding Squares Error See how different lines affect the total squared error: - The data shows the relationship between house area and price - Try different slopes (m) and y-intercepts (b) for the line - Watch how the squared errors (orange boxes) change - Lower total squared error means a better fitting line """) with gr.Row(): data_input = gr.Dataframe( headers=["X", "Y"], datatype=["number", "number"], row_count=5, col_count=2, label="Dataset", interactive=True, value=[[100, 10], [200, 20], [300, 30], [400, 40], [500, 50]] ) with gr.Column(): m_slider = gr.Slider( minimum=-10, maximum=10, value=1.0, step=0.1, label="Slope (m)", ) b_slider = gr.Slider( minimum=-10, maximum=10, value=0.0, step=0.1, label="Intercept (b)", ) submit_button = gr.Button("Submit") clear_button = gr.Button("Clear History") plot_output = gr.Plot() # Set up the event handlers inputs = [data_input, m_slider, b_slider] clear_button.click(fn=clear_history, inputs=None, outputs=plot_output) submit_button.click(fn=plot_regression, inputs=inputs, outputs=plot_output) if __name__ == "__main__": app.launch(show_api=False)