generate animate video for below # Save this as autoencoder_animation.py # Run with: manim -pql autoencoder_animation.py AutoencoderAnimation from manim import * class AutoencoderAnimation(Scene): def construct(self): # --- Title Scene --- title = Text("Autoencoder for Recommendations", font_size=48) self.play(Write(title)) self.wait(2) self.play(FadeOut(title)) self.wait(0.5) # --- 1. Input: User Ratings Vector --- input_label = Text("Input: User's Rating History", font_size=32).to_edge(UP) ratings = ["5", "0", "1", "0", "0", "4", "0", "0"] # 0 means unrated input_vector = self.create_vector_vis(ratings, "Input Vector", color=WHITE) input_vector.to_edge(LEFT) self.play(Write(input_label)) self.play(FadeIn(input_vector, shift=RIGHT)) self.wait(2) # --- 2. Encoder Architecture --- encoder_label = Text("Encoder", font_size=32).move_to(UP * 2) encoder_layers = self.create_mlp_tower([8, 5, 3], colors=[WHITE, BLUE, BLUE]) encoder_layers.move_to(ORIGIN) self.play(input_vector.animate.scale(0.8).next_to(encoder_layers, LEFT, buff=0.5)) self.play(Write(encoder_label), FadeIn(encoder_layers)) self.wait(1) # Animate compression self.play_network_flow(input_vector.squares, encoder_layers[0]) self.play_network_flow(encoder_layers[0], encoder_layers[1]) self.play_network_flow(encoder_layers[1], encoder_layers[2]) self.wait(1) # --- 3. Latent Vector (User DNA) --- latent_vector_vis = encoder_layers[2].copy() latent_label = Text("Latent Vector ('User DNA')", font_size=28).next_to(latent_vector_vis, DOWN, buff=0.5) self.play(latent_vector_vis.animate.move_to(ORIGIN).scale(1.2), FadeIn(latent_label)) self.play(FadeOut(input_vector, encoder_layers, encoder_label)) self.wait(2) # --- 4. Decoder Architecture --- decoder_label = Text("Decoder", font_size=32).move_to(UP * 2) decoder_layers = self.create_mlp_tower([3, 5, 8], colors=[BLUE, GREEN, GREEN]) decoder_layers.move_to(ORIGIN) self.play(latent_vector_vis.animate.scale(0.8).next_to(decoder_layers, LEFT, buff=0.5)) self.play(Write(decoder_label), FadeIn(decoder_layers)) self.wait(1) # Animate decompression self.play_network_flow(latent_vector_vis, decoder_layers[0]) self.play_network_flow(decoder_layers[0], decoder_layers[1]) self.play_network_flow(decoder_layers[1], decoder_layers[2]) self.wait(1) # --- 5. Output: Reconstructed Vector --- output_ratings = ["5.1", "2.3", "0.9", "3.5", "1.1", "4.2", "2.8", "3.9"] output_vector = self.create_vector_vis(output_ratings, "Reconstructed Vector", color=WHITE) output_vector.to_edge(RIGHT) self.play(ReplacementTransform(decoder_layers[2].copy(), output_vector)) self.play(FadeOut(decoder_label, decoder_layers, latent_vector_vis)) self.wait(2) # --- 6. Highlight Recommendations --- original_input_small = self.create_vector_vis(ratings, "Original", color=GRAY).scale(0.7).to_edge(DOWN + LEFT) reconstructed_small = self.create_vector_vis(output_ratings, "Reconstructed", color=WHITE).scale(0.7).to_edge(DOWN + RIGHT) self.play(FadeOut(input_vector), FadeIn(original_input_small, reconstructed_small)) self.wait(1) recommendation_label = Text("Recommendations are the filled-in blanks!", color=YELLOW).next_to(input_label, DOWN) self.play(Write(recommendation_label)) highlights = VGroup() for i in range(len(ratings)): if ratings[i] == "0": rect = SurroundingRectangle(reconstructed_small.squares[i], color=YELLOW) highlights.add(rect) self.play(Create(highlights)) self.wait(3) def create_vector_vis(self, values, label_text, color): squares = VGroup() for val in values: square = Square(side_length=0.8, color=color, stroke_width=2) text = Text(str(val), font_size=24).move_to(square.get_center()) squares.add(VGroup(square, text)) squares.arrange(RIGHT, buff=0.1) label = Text(label_text, font_size=24).next_to(squares, DOWN, buff=0.3) return VGroup(squares, label) def create_mlp_tower(self, layer_sizes, colors): layers = VGroup() for i, size in enumerate(layer_sizes): layer = VGroup(*[Circle(radius=0.2, color=colors[i], stroke_width=2, fill_opacity=0.5) for _ in range(size)]) layer.arrange(DOWN, buff=0.3) layers.add(layer) layers.arrange(RIGHT, buff=1.5) return layers def play_network_flow(self, layer1, layer2): edges = VGroup(*[Line(n1.get_center(), n2.get_center(), stroke_width=1.5, color=YELLOW) for n1 in layer1 for n2 in layer2]) self.play(LaggedStart( *[ShowPassingFlash(edge.copy().set_color(ORANGE), time_width=0.2) for edge in edges], lag_ratio=0.05 ), run_time=1)

视频信息