Python script that uses LLMs on Groq to create Python programs, iterating until they run to completion. Sample output:
prompt:
Write a Python function that fits a finite mixture of normals with a
specified # of components to univariate data, using the EM algorithm,
and write a main program that tests it for data simulated from a known
mixture distribution. Write a function to display the parameters in a
formatted table. Use the function to display the true and estimated
parameters. Use numpy if helpful. Use the print function to
display results, using to_string() for a pandas dataframe.
Only output Python code. Do not give commentary.
model: qwen-2.5-coder-32b
Code ran successfully after 1 attempt (generation time: 2.349 seconds, LOC=55)!
Output:
Component True Weight True Mean True Covariance Estimated Weight Estimated Mean Estimated Covariance
0 0.4 0 1 0.400835 0.057349 1.097366
1 0.6 5 1 0.599165 5.049657 0.943687
Total generation time: 2.349 seconds across 1 attempt
Run command: python main.py
The code generated is
# Generated from prompt file: prompt_mix.txt # Model used: qwen-2.5-coder-32b # Time generated: 2025年03月08日 16:45:03 # Generation time: 2.349 seconds import numpy as np import pandas as pd from scipy.stats import norm from scipy.special import logsumexp def fit_mixture_of_normals(data, k, max_iter=100, tol=1e-6): n = len(data) np.random.seed(0) means = np.random.choice(data, k) covariances = np.random.rand(k) weights = np.ones(k) / k r = np.zeros((n, k)) for _ in range(max_iter): # Expectation step for i in range(k): r[:, i] = weights[i] * norm.pdf(data, means[i], np.sqrt(covariances[i])) r /= r.sum(axis=1, keepdims=True) # Maximization step s = r.sum(axis=0) means = (r * data.reshape(-1, 1)).sum(axis=0) / s covariances = ((r * (data.reshape(-1, 1) - means)**2).sum(axis=0) / s).clip(min=1e-6) weights = s / n if (r.sum(axis=1) > 1 + tol).any() or (r.sum(axis=1) < 1 - tol).any(): raise ValueError("Row normalization failed") return weights, means, covariances def display_parameters(true_params, estimated_params): true_weights, true_means, true_covariances = true_params est_weights, est_means, est_covariances = estimated_params true_df = pd.DataFrame({ 'Component': range(len(true_weights)), 'True Weight': true_weights, 'True Mean': true_means, 'True Covariance': true_covariances }) est_df = pd.DataFrame({ 'Estimated Weight': est_weights, 'Estimated Mean': est_means, 'Estimated Covariance': est_covariances }) result_df = pd.concat([true_df, est_df], axis=1) print(result_df.to_string(index=False)) def main(): true_weights = np.array([0.4, 0.6]) true_means = np.array([0, 5]) true_covariances = np.array([1, 1]) n_samples = 1000 data = np.concatenate([ np.random.normal(true_means[0], np.sqrt(true_covariances[0]), int(true_weights[0] * n_samples)), np.random.normal(true_means[1], np.sqrt(true_covariances[1]), int(true_weights[1] * n_samples)) ]) estimated_weights, estimated_means, estimated_covariances = fit_mixture_of_normals(data, len(true_weights)) true_params = (true_weights, true_means, true_covariances) estimated_params = (estimated_weights, estimated_means, estimated_covariances) display_parameters(true_params, estimated_params) if __name__ == "__main__": main()