melage 0.0.65__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- melage/__init__.py +16 -0
- melage/cli.py +4 -0
- melage/graphics/GLGraphicsItem.py +286 -0
- melage/graphics/GLViewWidget.py +595 -0
- melage/graphics/Transform3D.py +55 -0
- melage/graphics/__init__.py +8 -0
- melage/graphics/functions.py +101 -0
- melage/graphics/items/GLAxisItem.py +149 -0
- melage/graphics/items/GLGridItem.py +178 -0
- melage/graphics/items/GLPolygonItem.py +77 -0
- melage/graphics/items/GLScatterPlotItem.py +135 -0
- melage/graphics/items/GLVolumeItem.py +280 -0
- melage/graphics/items/GLVolumeItem_b.py +237 -0
- melage/graphics/items/__init__.py +0 -0
- melage/graphics/shaders.py +202 -0
- melage/main.py +270 -0
- melage/requirements22.txt +25 -0
- melage/requirements_old.txt +28 -0
- melage/resource/0circle.png +0 -0
- melage/resource/0circle_faded.png +0 -0
- melage/resource/3d.png +0 -0
- melage/resource/3d.psd +0 -0
- melage/resource/3dFaded.png +0 -0
- melage/resource/Eraser.png +0 -0
- melage/resource/EraserFaded.png +0 -0
- melage/resource/EraserX.png +0 -0
- melage/resource/EraserXFaded.png +0 -0
- melage/resource/Eraser_icon.svg +79 -0
- melage/resource/Hand.png +0 -0
- melage/resource/HandIcons_0.png +0 -0
- melage/resource/Hand_IX.png +0 -0
- melage/resource/Hand_IXFaded.png +0 -0
- melage/resource/Handsqueezed.png +0 -0
- melage/resource/Handwriting (copy).png +0 -0
- melage/resource/Handwriting.png +0 -0
- melage/resource/HandwritingMinus.png +0 -0
- melage/resource/HandwritingMinusX.png +0 -0
- melage/resource/HandwritingPlus.png +0 -0
- melage/resource/HandwritingPlusX.png +0 -0
- melage/resource/Move_icon.svg +8 -0
- melage/resource/PngItem_2422924.png +0 -0
- melage/resource/about.png +0 -0
- melage/resource/about_logo.png +0 -0
- melage/resource/about_logo0.png +0 -0
- melage/resource/action_check.png +0 -0
- melage/resource/action_check_OFF.png +0 -0
- melage/resource/arrow).png +0 -0
- melage/resource/arrow.png +0 -0
- melage/resource/arrowFaded.png +0 -0
- melage/resource/arrow_org.png +0 -0
- melage/resource/arrow_org.png.png +0 -0
- melage/resource/arrows.png +0 -0
- melage/resource/authors.mp4 +0 -0
- melage/resource/box.png +0 -0
- melage/resource/check-image-icon-0.jpg +0 -0
- melage/resource/circle.png +0 -0
- melage/resource/circle_faded.png +0 -0
- melage/resource/circle_or.png +0 -0
- melage/resource/close.png +0 -0
- melage/resource/close_bg.png +0 -0
- melage/resource/color/Simple.txt +18 -0
- melage/resource/color/Tissue.txt +24 -0
- melage/resource/color/Tissue12.txt +27 -0
- melage/resource/color/albert_LUT.txt +102 -0
- melage/resource/color/mcrib_LUT.txt +102 -0
- melage/resource/color/pediatric1.txt +29 -0
- melage/resource/color/pediatric1_old.txt +27 -0
- melage/resource/color/pediatric2.txt +87 -0
- melage/resource/color/pediatric3.txt +29 -0
- melage/resource/color/pediatrics (copy).csv +103 -0
- melage/resource/color/tissue_seg.txt +4 -0
- melage/resource/contour.png +0 -0
- melage/resource/contour.svg +2 -0
- melage/resource/contourFaded.png +0 -0
- melage/resource/contourX.png +0 -0
- melage/resource/contourXFaded.png +0 -0
- melage/resource/dti.png +0 -0
- melage/resource/dti0.png +0 -0
- melage/resource/dti222.png +0 -0
- melage/resource/dti_or.png +0 -0
- melage/resource/eco.png +0 -0
- melage/resource/eco22.png +0 -0
- melage/resource/eco_old.png +0 -0
- melage/resource/eco_or.png +0 -0
- melage/resource/eco_or2.png +0 -0
- melage/resource/eco_seg.png +0 -0
- melage/resource/eco_seg_old.png +0 -0
- melage/resource/export.png +0 -0
- melage/resource/hand-grab-icon-10.jpg +0 -0
- melage/resource/hand-grab-icon-25.jpg +0 -0
- melage/resource/info.png +0 -0
- melage/resource/line.png +0 -0
- melage/resource/linefaded.png +0 -0
- melage/resource/load.png +0 -0
- melage/resource/main.ico +0 -0
- melage/resource/manual_images/3D_rightc.png +0 -0
- melage/resource/manual_images/3D_rightc_goto.png +0 -0
- melage/resource/manual_images/3D_rightc_paint.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render2.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render3.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render4.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render5.png +0 -0
- melage/resource/manual_images/3D_rightc_paint_render6.png +0 -0
- melage/resource/manual_images/3D_rightc_seg.png +0 -0
- melage/resource/manual_images/exit_toolbar.png +0 -0
- melage/resource/manual_images/load_image_file.png +0 -0
- melage/resource/manual_images/load_image_file_openp.png +0 -0
- melage/resource/manual_images/main_page.png +0 -0
- melage/resource/manual_images/menu_file.png +0 -0
- melage/resource/manual_images/menu_file_export.png +0 -0
- melage/resource/manual_images/menu_file_import.png +0 -0
- melage/resource/manual_images/menu_file_settings.png +0 -0
- melage/resource/manual_images/menu_file_ss.png +0 -0
- melage/resource/manual_images/open_save_load.png +0 -0
- melage/resource/manual_images/panning_toolbar.png +0 -0
- melage/resource/manual_images/segmentation_toolbar.png +0 -0
- melage/resource/manual_images/tab_mri.png +0 -0
- melage/resource/manual_images/tab_us.png +0 -0
- melage/resource/manual_images/tabs.png +0 -0
- melage/resource/manual_images/toolbar_tools.png +0 -0
- melage/resource/manual_images/tools_basic.png +0 -0
- melage/resource/manual_images/tools_bet.png +0 -0
- melage/resource/manual_images/tools_cs.png +0 -0
- melage/resource/manual_images/tools_deepbet.png +0 -0
- melage/resource/manual_images/tools_imageinfo.png +0 -0
- melage/resource/manual_images/tools_maskO.png +0 -0
- melage/resource/manual_images/tools_masking.png +0 -0
- melage/resource/manual_images/tools_n4b.png +0 -0
- melage/resource/manual_images/tools_resize.png +0 -0
- melage/resource/manual_images/tools_ruler.png +0 -0
- melage/resource/manual_images/tools_seg.png +0 -0
- melage/resource/manual_images/tools_threshold.png +0 -0
- melage/resource/manual_images/tools_tools.png +0 -0
- melage/resource/manual_images/widget_color.png +0 -0
- melage/resource/manual_images/widget_color_add.png +0 -0
- melage/resource/manual_images/widget_color_add2.png +0 -0
- melage/resource/manual_images/widget_color_additional.png +0 -0
- melage/resource/manual_images/widget_images.png +0 -0
- melage/resource/manual_images/widget_images2.png +0 -0
- melage/resource/manual_images/widget_images3.png +0 -0
- melage/resource/manual_images/widget_marker.png +0 -0
- melage/resource/manual_images/widget_mri.png +0 -0
- melage/resource/manual_images/widget_mri2.png +0 -0
- melage/resource/manual_images/widget_segintensity.png +0 -0
- melage/resource/manual_images/widget_tab_mutualview.png +0 -0
- melage/resource/manual_images/widget_tab_mutualview2.png +0 -0
- melage/resource/manual_images/widget_table.png +0 -0
- melage/resource/manual_images/widget_table2.png +0 -0
- melage/resource/manual_images/widget_us.png +0 -0
- melage/resource/melage_top.ico +0 -0
- melage/resource/melage_top.png +0 -0
- melage/resource/melage_top0.png +0 -0
- melage/resource/melage_top1.png +0 -0
- melage/resource/melage_top4.png +0 -0
- melage/resource/mri (copy).png +0 -0
- melage/resource/mri.png +0 -0
- melage/resource/mri0.png +0 -0
- melage/resource/mri000.png +0 -0
- melage/resource/mri22.png +0 -0
- melage/resource/mri_big.png +0 -0
- melage/resource/mri_old.png +0 -0
- melage/resource/mri_seg.png +0 -0
- melage/resource/mri_seg_old.png +0 -0
- melage/resource/new.png +0 -0
- melage/resource/open.png +0 -0
- melage/resource/open2.png +0 -0
- melage/resource/pan.png +0 -0
- melage/resource/pencil.png +0 -0
- melage/resource/pencilFaded.png +0 -0
- melage/resource/points.png +0 -0
- melage/resource/pointsFaded.png +0 -0
- melage/resource/rotate.png +0 -0
- melage/resource/ruler.png +0 -0
- melage/resource/rulerFaded.png +0 -0
- melage/resource/s.png +0 -0
- melage/resource/s.psd +0 -0
- melage/resource/save.png +0 -0
- melage/resource/saveas.png +0 -0
- melage/resource/seg_mri.png +0 -0
- melage/resource/seg_mri2.png +0 -0
- melage/resource/settings.png +0 -0
- melage/resource/synch.png +0 -0
- melage/resource/synchFaded.png +0 -0
- melage/resource/theme/rc/.keep +1 -0
- melage/resource/theme/rc/arrow_down.png +0 -0
- melage/resource/theme/rc/arrow_down@2x.png +0 -0
- melage/resource/theme/rc/arrow_down_disabled.png +0 -0
- melage/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
- melage/resource/theme/rc/arrow_down_focus.png +0 -0
- melage/resource/theme/rc/arrow_down_focus@2x.png +0 -0
- melage/resource/theme/rc/arrow_down_pressed.png +0 -0
- melage/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
- melage/resource/theme/rc/arrow_left.png +0 -0
- melage/resource/theme/rc/arrow_left@2x.png +0 -0
- melage/resource/theme/rc/arrow_left_disabled.png +0 -0
- melage/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
- melage/resource/theme/rc/arrow_left_focus.png +0 -0
- melage/resource/theme/rc/arrow_left_focus@2x.png +0 -0
- melage/resource/theme/rc/arrow_left_pressed.png +0 -0
- melage/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
- melage/resource/theme/rc/arrow_right.png +0 -0
- melage/resource/theme/rc/arrow_right@2x.png +0 -0
- melage/resource/theme/rc/arrow_right_disabled.png +0 -0
- melage/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
- melage/resource/theme/rc/arrow_right_focus.png +0 -0
- melage/resource/theme/rc/arrow_right_focus@2x.png +0 -0
- melage/resource/theme/rc/arrow_right_pressed.png +0 -0
- melage/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
- melage/resource/theme/rc/arrow_up.png +0 -0
- melage/resource/theme/rc/arrow_up@2x.png +0 -0
- melage/resource/theme/rc/arrow_up_disabled.png +0 -0
- melage/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
- melage/resource/theme/rc/arrow_up_focus.png +0 -0
- melage/resource/theme/rc/arrow_up_focus@2x.png +0 -0
- melage/resource/theme/rc/arrow_up_pressed.png +0 -0
- melage/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
- melage/resource/theme/rc/base_icon.png +0 -0
- melage/resource/theme/rc/base_icon@2x.png +0 -0
- melage/resource/theme/rc/base_icon_disabled.png +0 -0
- melage/resource/theme/rc/base_icon_disabled@2x.png +0 -0
- melage/resource/theme/rc/base_icon_focus.png +0 -0
- melage/resource/theme/rc/base_icon_focus@2x.png +0 -0
- melage/resource/theme/rc/base_icon_pressed.png +0 -0
- melage/resource/theme/rc/base_icon_pressed@2x.png +0 -0
- melage/resource/theme/rc/branch_closed.png +0 -0
- melage/resource/theme/rc/branch_closed@2x.png +0 -0
- melage/resource/theme/rc/branch_closed_disabled.png +0 -0
- melage/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
- melage/resource/theme/rc/branch_closed_focus.png +0 -0
- melage/resource/theme/rc/branch_closed_focus@2x.png +0 -0
- melage/resource/theme/rc/branch_closed_pressed.png +0 -0
- melage/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
- melage/resource/theme/rc/branch_end.png +0 -0
- melage/resource/theme/rc/branch_end@2x.png +0 -0
- melage/resource/theme/rc/branch_end_disabled.png +0 -0
- melage/resource/theme/rc/branch_end_disabled@2x.png +0 -0
- melage/resource/theme/rc/branch_end_focus.png +0 -0
- melage/resource/theme/rc/branch_end_focus@2x.png +0 -0
- melage/resource/theme/rc/branch_end_pressed.png +0 -0
- melage/resource/theme/rc/branch_end_pressed@2x.png +0 -0
- melage/resource/theme/rc/branch_line.png +0 -0
- melage/resource/theme/rc/branch_line@2x.png +0 -0
- melage/resource/theme/rc/branch_line_disabled.png +0 -0
- melage/resource/theme/rc/branch_line_disabled@2x.png +0 -0
- melage/resource/theme/rc/branch_line_focus.png +0 -0
- melage/resource/theme/rc/branch_line_focus@2x.png +0 -0
- melage/resource/theme/rc/branch_line_pressed.png +0 -0
- melage/resource/theme/rc/branch_line_pressed@2x.png +0 -0
- melage/resource/theme/rc/branch_more.png +0 -0
- melage/resource/theme/rc/branch_more@2x.png +0 -0
- melage/resource/theme/rc/branch_more_disabled.png +0 -0
- melage/resource/theme/rc/branch_more_disabled@2x.png +0 -0
- melage/resource/theme/rc/branch_more_focus.png +0 -0
- melage/resource/theme/rc/branch_more_focus@2x.png +0 -0
- melage/resource/theme/rc/branch_more_pressed.png +0 -0
- melage/resource/theme/rc/branch_more_pressed@2x.png +0 -0
- melage/resource/theme/rc/branch_open.png +0 -0
- melage/resource/theme/rc/branch_open@2x.png +0 -0
- melage/resource/theme/rc/branch_open_disabled.png +0 -0
- melage/resource/theme/rc/branch_open_disabled@2x.png +0 -0
- melage/resource/theme/rc/branch_open_focus.png +0 -0
- melage/resource/theme/rc/branch_open_focus@2x.png +0 -0
- melage/resource/theme/rc/branch_open_pressed.png +0 -0
- melage/resource/theme/rc/branch_open_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked.png +0 -0
- melage/resource/theme/rc/checkbox_checked0.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
- melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
- melage/resource/theme/rc/line_horizontal.png +0 -0
- melage/resource/theme/rc/line_horizontal@2x.png +0 -0
- melage/resource/theme/rc/line_horizontal_disabled.png +0 -0
- melage/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
- melage/resource/theme/rc/line_horizontal_focus.png +0 -0
- melage/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
- melage/resource/theme/rc/line_horizontal_pressed.png +0 -0
- melage/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
- melage/resource/theme/rc/line_vertical.png +0 -0
- melage/resource/theme/rc/line_vertical@2x.png +0 -0
- melage/resource/theme/rc/line_vertical_disabled.png +0 -0
- melage/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
- melage/resource/theme/rc/line_vertical_focus.png +0 -0
- melage/resource/theme/rc/line_vertical_focus@2x.png +0 -0
- melage/resource/theme/rc/line_vertical_pressed.png +0 -0
- melage/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
- melage/resource/theme/rc/radio_checked.png +0 -0
- melage/resource/theme/rc/radio_checked@2x.png +0 -0
- melage/resource/theme/rc/radio_checked_disabled.png +0 -0
- melage/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
- melage/resource/theme/rc/radio_checked_focus.png +0 -0
- melage/resource/theme/rc/radio_checked_focus@2x.png +0 -0
- melage/resource/theme/rc/radio_checked_pressed.png +0 -0
- melage/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
- melage/resource/theme/rc/radio_unchecked.png +0 -0
- melage/resource/theme/rc/radio_unchecked@2x.png +0 -0
- melage/resource/theme/rc/radio_unchecked_disabled.png +0 -0
- melage/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
- melage/resource/theme/rc/radio_unchecked_focus.png +0 -0
- melage/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
- melage/resource/theme/rc/radio_unchecked_pressed.png +0 -0
- melage/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
- melage/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
- melage/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
- melage/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
- melage/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
- melage/resource/theme/rc/transparent.png +0 -0
- melage/resource/theme/rc/transparent@2x.png +0 -0
- melage/resource/theme/rc/transparent_disabled.png +0 -0
- melage/resource/theme/rc/transparent_disabled@2x.png +0 -0
- melage/resource/theme/rc/transparent_focus.png +0 -0
- melage/resource/theme/rc/transparent_focus@2x.png +0 -0
- melage/resource/theme/rc/transparent_pressed.png +0 -0
- melage/resource/theme/rc/transparent_pressed@2x.png +0 -0
- melage/resource/theme/rc/window_close.png +0 -0
- melage/resource/theme/rc/window_close@2x.png +0 -0
- melage/resource/theme/rc/window_close_disabled.png +0 -0
- melage/resource/theme/rc/window_close_disabled@2x.png +0 -0
- melage/resource/theme/rc/window_close_focus.png +0 -0
- melage/resource/theme/rc/window_close_focus@2x.png +0 -0
- melage/resource/theme/rc/window_close_pressed.png +0 -0
- melage/resource/theme/rc/window_close_pressed@2x.png +0 -0
- melage/resource/theme/rc/window_grip.png +0 -0
- melage/resource/theme/rc/window_grip@2x.png +0 -0
- melage/resource/theme/rc/window_grip_disabled.png +0 -0
- melage/resource/theme/rc/window_grip_disabled@2x.png +0 -0
- melage/resource/theme/rc/window_grip_focus.png +0 -0
- melage/resource/theme/rc/window_grip_focus@2x.png +0 -0
- melage/resource/theme/rc/window_grip_pressed.png +0 -0
- melage/resource/theme/rc/window_grip_pressed@2x.png +0 -0
- melage/resource/theme/rc/window_minimize.png +0 -0
- melage/resource/theme/rc/window_minimize@2x.png +0 -0
- melage/resource/theme/rc/window_minimize_disabled.png +0 -0
- melage/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
- melage/resource/theme/rc/window_minimize_focus.png +0 -0
- melage/resource/theme/rc/window_minimize_focus@2x.png +0 -0
- melage/resource/theme/rc/window_minimize_pressed.png +0 -0
- melage/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
- melage/resource/theme/rc/window_undock.png +0 -0
- melage/resource/theme/rc/window_undock@2x.png +0 -0
- melage/resource/theme/rc/window_undock_disabled.png +0 -0
- melage/resource/theme/rc/window_undock_disabled@2x.png +0 -0
- melage/resource/theme/rc/window_undock_focus.png +0 -0
- melage/resource/theme/rc/window_undock_focus@2x.png +0 -0
- melage/resource/theme/rc/window_undock_pressed.png +0 -0
- melage/resource/theme/rc/window_undock_pressed@2x.png +0 -0
- melage/resource/theme/style.qss +2223 -0
- melage/resource/tract.png +0 -0
- melage/resource/view1.png +0 -0
- melage/resource/view1_eco.png +0 -0
- melage/resource/view1_mri.png +0 -0
- melage/resource/view1_seg.png +0 -0
- melage/resource/view2.png +0 -0
- melage/resource/view2_seg.png +0 -0
- melage/resource/w.png +0 -0
- melage/resource/zoom_in.png +0 -0
- melage/resource/zoom_inFaded.png +0 -0
- melage/resource/zoom_out.png +0 -0
- melage/resource/zoom_outFaded.png +0 -0
- melage/some_notes.txt +3 -0
- melage/utils/DispalyIm.py +2788 -0
- melage/utils/GMM.py +720 -0
- melage/utils/Shaders_120.py +257 -0
- melage/utils/Shaders_330.py +314 -0
- melage/utils/Shaders_bu.py +314 -0
- melage/utils/__init__0.py +7 -0
- melage/utils/brain_extraction_helper.py +234 -0
- melage/utils/custom_QScrollBar.py +61 -0
- melage/utils/glScientific.py +1554 -0
- melage/utils/glScientific_bc.py +1585 -0
- melage/utils/readData.py +1061 -0
- melage/utils/registration.py +512 -0
- melage/utils/source_folder.py +18 -0
- melage/utils/utils.py +3808 -0
- melage/version.txt +1 -0
- melage/widgets/ApplyMask.py +212 -0
- melage/widgets/ChangeSystem.py +152 -0
- melage/widgets/DeepLModels/InfantSegment/Unet.py +464 -0
- melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +149 -0
- melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
- melage/widgets/DeepLModels/NPP/models/losses.py +146 -0
- melage/widgets/DeepLModels/NPP/models/model.py +272 -0
- melage/widgets/DeepLModels/NPP/models/utils.py +303 -0
- melage/widgets/DeepLModels/NPP/npp.py +116 -0
- melage/widgets/DeepLModels/NPP/requirements.txt +8 -0
- melage/widgets/DeepLModels/NPP/train/train.py +116 -0
- melage/widgets/DeepLModels/Unet3DAtt.py +657 -0
- melage/widgets/DeepLModels/Unet3D_basic.py +648 -0
- melage/widgets/DeepLModels/new_unet.py +652 -0
- melage/widgets/DeepLModels/new_unet_old.py +639 -0
- melage/widgets/DeepLModels/new_unet_old2.py +658 -0
- melage/widgets/HistImage.py +153 -0
- melage/widgets/ImageThresholding.py +222 -0
- melage/widgets/MaskOperations.py +147 -0
- melage/widgets/N4Dialog.py +241 -0
- melage/widgets/Segmentation/FCM.py +1553 -0
- melage/widgets/Segmentation/__init__.py +588 -0
- melage/widgets/Segmentation/utils.py +417 -0
- melage/widgets/SemiAutoSeg.py +666 -0
- melage/widgets/Synthstrip.py +141 -0
- melage/widgets/__init__0.py +5 -0
- melage/widgets/about.py +246 -0
- melage/widgets/activation.py +437 -0
- melage/widgets/activator.py +147 -0
- melage/widgets/be_dl.py +409 -0
- melage/widgets/be_dl_unet3d.py +441 -0
- melage/widgets/brain_extraction.py +855 -0
- melage/widgets/brain_extraction_dl.py +887 -0
- melage/widgets/brain_extraction_dl_bu.py +869 -0
- melage/widgets/colorwidget.py +100 -0
- melage/widgets/dockWidgets.py +2005 -0
- melage/widgets/enhanceImWidget.py +109 -0
- melage/widgets/fileDialog_widget.py +275 -0
- melage/widgets/iminfo.py +346 -0
- melage/widgets/mainwindow_widget.py +6775 -0
- melage/widgets/melageAbout.py +123 -0
- melage/widgets/openglWidgets.py +556 -0
- melage/widgets/registrationWidget.py +342 -0
- melage/widgets/repeat_widget.py +74 -0
- melage/widgets/screenshot_widget.py +138 -0
- melage/widgets/settings_widget.py +77 -0
- melage/widgets/tranformationWidget.py +275 -0
- melage-0.0.65.dist-info/METADATA +742 -0
- melage-0.0.65.dist-info/RECORD +501 -0
- melage-0.0.65.dist-info/WHEEL +5 -0
- melage-0.0.65.dist-info/entry_points.txt +2 -0
- melage-0.0.65.dist-info/top_level.txt +1 -0
melage/utils/GMM.py
ADDED
|
@@ -0,0 +1,720 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from scipy.special import logsumexp
|
|
3
|
+
from scipy import linalg
|
|
4
|
+
from sklearn.cluster import KMeans
|
|
5
|
+
"""
|
|
6
|
+
GMM has been used from
|
|
7
|
+
https://atavory.github.io/ibex/_modules/sklearn/mixture/gaussian_mixture.html
|
|
8
|
+
with some modification
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def _check_precision_positivity(precision, covariance_type):
|
|
12
|
+
"""Check a precision vector is positive-definite."""
|
|
13
|
+
if np.any(np.less_equal(precision, 0.0)):
|
|
14
|
+
raise ValueError("'%s precision' should be "
|
|
15
|
+
"positive" % covariance_type)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _check_precision_matrix(precision, covariance_type):
|
|
19
|
+
"""Check a precision matrix is symmetric and positive-definite."""
|
|
20
|
+
if not (np.allclose(precision, precision.T) and
|
|
21
|
+
np.all(linalg.eigvalsh(precision) > 0.)):
|
|
22
|
+
raise ValueError("'%s precision' should be symmetric, "
|
|
23
|
+
"positive-definite" % covariance_type)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _check_precisions_full(precisions, covariance_type):
|
|
27
|
+
"""Check the precision matrices are symmetric and positive-definite."""
|
|
28
|
+
for prec in precisions:
|
|
29
|
+
_check_precision_matrix(prec, covariance_type)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
###############################################################################
|
|
35
|
+
# Gaussian mixture parameters estimators (used by the M-Step)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class GaussianMixture(object):
|
|
40
|
+
"""Gaussian Mixture.
|
|
41
|
+
|
|
42
|
+
Representation of a Gaussian mixture model probability distribution.
|
|
43
|
+
This class allows to estimate the parameters of a Gaussian mixture
|
|
44
|
+
distribution.
|
|
45
|
+
|
|
46
|
+
Read more in the :ref:`User Guide <gmm>`.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.18
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
n_components : int, default=1
|
|
53
|
+
The number of mixture components.
|
|
54
|
+
|
|
55
|
+
covariance_type : {'full', 'tied', 'diag', 'spherical'}, default='full'
|
|
56
|
+
String describing the type of covariance parameters to use.
|
|
57
|
+
Must be one of:
|
|
58
|
+
|
|
59
|
+
'full'
|
|
60
|
+
each component has its own general covariance matrix
|
|
61
|
+
'tied'
|
|
62
|
+
all components share the same general covariance matrix
|
|
63
|
+
'diag'
|
|
64
|
+
each component has its own diagonal covariance matrix
|
|
65
|
+
'spherical'
|
|
66
|
+
each component has its own single variance
|
|
67
|
+
|
|
68
|
+
tol : float, default=1e-3
|
|
69
|
+
The convergence threshold. EM iterations will stop when the
|
|
70
|
+
lower bound average gain is below this threshold.
|
|
71
|
+
|
|
72
|
+
reg_covar : float, default=1e-6
|
|
73
|
+
Non-negative regularization added to the diagonal of covariance.
|
|
74
|
+
Allows to assure that the covariance matrices are all positive.
|
|
75
|
+
|
|
76
|
+
max_iter : int, default=100
|
|
77
|
+
The number of EM iterations to perform.
|
|
78
|
+
|
|
79
|
+
n_init : int, default=1
|
|
80
|
+
The number of initializations to perform. The best results are kept.
|
|
81
|
+
|
|
82
|
+
init_params : {'kmeans', 'random'}, default='kmeans'
|
|
83
|
+
The method used to initialize the weights, the means and the
|
|
84
|
+
precisions.
|
|
85
|
+
Must be one of::
|
|
86
|
+
|
|
87
|
+
'kmeans' : responsibilities are initialized using kmeans.
|
|
88
|
+
'random' : responsibilities are initialized randomly.
|
|
89
|
+
|
|
90
|
+
weights_init : array-like of shape (n_components, ), default=None
|
|
91
|
+
The user-provided initial weights.
|
|
92
|
+
If it is None, weights are initialized using the `init_params` method.
|
|
93
|
+
|
|
94
|
+
means_init : array-like of shape (n_components, n_features), default=None
|
|
95
|
+
The user-provided initial means,
|
|
96
|
+
If it is None, means are initialized using the `init_params` method.
|
|
97
|
+
|
|
98
|
+
precisions_init : array-like, default=None
|
|
99
|
+
The user-provided initial precisions (inverse of the covariance
|
|
100
|
+
matrices).
|
|
101
|
+
If it is None, precisions are initialized using the 'init_params'
|
|
102
|
+
method.
|
|
103
|
+
The shape depends on 'covariance_type'::
|
|
104
|
+
|
|
105
|
+
(n_components,) if 'spherical',
|
|
106
|
+
(n_features, n_features) if 'tied',
|
|
107
|
+
(n_components, n_features) if 'diag',
|
|
108
|
+
(n_components, n_features, n_features) if 'full'
|
|
109
|
+
|
|
110
|
+
random_state : int, RandomState instance or None, default=None
|
|
111
|
+
Controls the random seed given to the method chosen to initialize the
|
|
112
|
+
parameters (see `init_params`).
|
|
113
|
+
In addition, it controls the generation of random samples from the
|
|
114
|
+
fitted distribution (see the method `sample`).
|
|
115
|
+
Pass an int for reproducible output across multiple function calls.
|
|
116
|
+
See :term:`Glossary <random_state>`.
|
|
117
|
+
|
|
118
|
+
warm_start : bool, default=False
|
|
119
|
+
If 'warm_start' is True, the solution of the last fitting is used as
|
|
120
|
+
initialization for the next call of fit(). This can speed up
|
|
121
|
+
convergence when fit is called several times on similar problems.
|
|
122
|
+
In that case, 'n_init' is ignored and only a single initialization
|
|
123
|
+
occurs upon the first call.
|
|
124
|
+
See :term:`the Glossary <warm_start>`.
|
|
125
|
+
|
|
126
|
+
verbose : int, default=0
|
|
127
|
+
Enable verbose output. If 1 then it prints the current
|
|
128
|
+
initialization and each iteration step. If greater than 1 then
|
|
129
|
+
it prints also the log probability and the time needed
|
|
130
|
+
for each step.
|
|
131
|
+
|
|
132
|
+
verbose_interval : int, default=10
|
|
133
|
+
Number of iteration done before the next print.
|
|
134
|
+
|
|
135
|
+
Attributes
|
|
136
|
+
----------
|
|
137
|
+
weights_ : array-like of shape (n_components,)
|
|
138
|
+
The weights of each mixture components.
|
|
139
|
+
|
|
140
|
+
means_ : array-like of shape (n_components, n_features)
|
|
141
|
+
The mean of each mixture component.
|
|
142
|
+
|
|
143
|
+
covariances_ : array-like
|
|
144
|
+
The covariance of each mixture component.
|
|
145
|
+
The shape depends on `covariance_type`::
|
|
146
|
+
|
|
147
|
+
(n_components,) if 'spherical',
|
|
148
|
+
(n_features, n_features) if 'tied',
|
|
149
|
+
(n_components, n_features) if 'diag',
|
|
150
|
+
(n_components, n_features, n_features) if 'full'
|
|
151
|
+
|
|
152
|
+
precisions_ : array-like
|
|
153
|
+
The precision matrices for each component in the mixture. A precision
|
|
154
|
+
matrix is the inverse of a covariance matrix. A covariance matrix is
|
|
155
|
+
symmetric positive definite so the mixture of Gaussian can be
|
|
156
|
+
equivalently parameterized by the precision matrices. Storing the
|
|
157
|
+
precision matrices instead of the covariance matrices makes it more
|
|
158
|
+
efficient to compute the log-likelihood of new samples at test time.
|
|
159
|
+
The shape depends on `covariance_type`::
|
|
160
|
+
|
|
161
|
+
(n_components,) if 'spherical',
|
|
162
|
+
(n_features, n_features) if 'tied',
|
|
163
|
+
(n_components, n_features) if 'diag',
|
|
164
|
+
(n_components, n_features, n_features) if 'full'
|
|
165
|
+
|
|
166
|
+
precisions_cholesky_ : array-like
|
|
167
|
+
The cholesky decomposition of the precision matrices of each mixture
|
|
168
|
+
component. A precision matrix is the inverse of a covariance matrix.
|
|
169
|
+
A covariance matrix is symmetric positive definite so the mixture of
|
|
170
|
+
Gaussian can be equivalently parameterized by the precision matrices.
|
|
171
|
+
Storing the precision matrices instead of the covariance matrices makes
|
|
172
|
+
it more efficient to compute the log-likelihood of new samples at test
|
|
173
|
+
time. The shape depends on `covariance_type`::
|
|
174
|
+
|
|
175
|
+
(n_components,) if 'spherical',
|
|
176
|
+
(n_features, n_features) if 'tied',
|
|
177
|
+
(n_components, n_features) if 'diag',
|
|
178
|
+
(n_components, n_features, n_features) if 'full'
|
|
179
|
+
|
|
180
|
+
converged_ : bool
|
|
181
|
+
True when convergence was reached in fit(), False otherwise.
|
|
182
|
+
|
|
183
|
+
n_iter_ : int
|
|
184
|
+
Number of step used by the best fit of EM to reach the convergence.
|
|
185
|
+
|
|
186
|
+
lower_bound_ : float
|
|
187
|
+
Lower bound value on the log-likelihood (of the training data with
|
|
188
|
+
respect to the model) of the best fit of EM.
|
|
189
|
+
|
|
190
|
+
Examples
|
|
191
|
+
--------
|
|
192
|
+
>>> import numpy as np
|
|
193
|
+
>>> from sklearn.mixture import GaussianMixture
|
|
194
|
+
>>> X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
|
|
195
|
+
>>> gm = GaussianMixture(n_components=2, random_state=0).fit(X)
|
|
196
|
+
>>> gm.means_
|
|
197
|
+
array([[10., 2.],
|
|
198
|
+
[ 1., 2.]])
|
|
199
|
+
>>> gm.predict([[0, 0], [12, 3]])
|
|
200
|
+
array([1, 0])
|
|
201
|
+
|
|
202
|
+
See Also
|
|
203
|
+
--------
|
|
204
|
+
BayesianGaussianMixture : Gaussian mixture model fit with a variational
|
|
205
|
+
inference.
|
|
206
|
+
"""
|
|
207
|
+
#@_deprecate_positional_args
|
|
208
|
+
def __init__(self, n_components=1, *, covariance_type='full', tol=1e-3,
|
|
209
|
+
reg_covar=1e-6, max_iter=100, n_init=1, init_params='kmeans',
|
|
210
|
+
weights_init=None, means_init=None, precisions_init=None,
|
|
211
|
+
random_state=None, warm_start=False,
|
|
212
|
+
verbose=0, verbose_interval=10):
|
|
213
|
+
# super().__init__(
|
|
214
|
+
# n_components=n_components, tol=tol, reg_covar=reg_covar,
|
|
215
|
+
# max_iter=max_iter, n_init=n_init, init_params=init_params,
|
|
216
|
+
# random_state=random_state, warm_start=warm_start,
|
|
217
|
+
# verbose=verbose, verbose_interval=verbose_interval)
|
|
218
|
+
|
|
219
|
+
self.covariance_type = covariance_type
|
|
220
|
+
self.weights_init = weights_init
|
|
221
|
+
self.means_init = means_init
|
|
222
|
+
self.precisions_init = precisions_init
|
|
223
|
+
|
|
224
|
+
self.n_components = n_components
|
|
225
|
+
self.tol = tol
|
|
226
|
+
self.reg_covar = reg_covar
|
|
227
|
+
self.max_iter = max_iter
|
|
228
|
+
self.n_init = n_init
|
|
229
|
+
self.init_params = init_params
|
|
230
|
+
self.random_state = random_state
|
|
231
|
+
self.warm_start = warm_start
|
|
232
|
+
self.verbose = verbose
|
|
233
|
+
self.verbose_interval = verbose_interval
|
|
234
|
+
|
|
235
|
+
def _estimate_gaussian_covariances_full(self, resp, X, nk, means, reg_covar):
|
|
236
|
+
"""Estimate the full covariance matrices.
|
|
237
|
+
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
resp : array-like of shape (n_samples, n_components)
|
|
241
|
+
|
|
242
|
+
X : array-like of shape (n_samples, n_features)
|
|
243
|
+
|
|
244
|
+
nk : array-like of shape (n_components,)
|
|
245
|
+
|
|
246
|
+
means : array-like of shape (n_components, n_features)
|
|
247
|
+
|
|
248
|
+
reg_covar : float
|
|
249
|
+
|
|
250
|
+
Returns
|
|
251
|
+
-------
|
|
252
|
+
covariances : array, shape (n_components, n_features, n_features)
|
|
253
|
+
The covariance matrix of the current components.
|
|
254
|
+
"""
|
|
255
|
+
n_components, n_features = means.shape
|
|
256
|
+
covariances = np.empty((n_components, n_features, n_features))
|
|
257
|
+
for k in range(n_components):
|
|
258
|
+
diff = X - means[k]
|
|
259
|
+
covariances[k] = np.dot(resp[:, k] * diff.T, diff) / nk[k]
|
|
260
|
+
covariances[k].flat[::n_features + 1] += reg_covar
|
|
261
|
+
return covariances
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _estimate_gaussian_covariances_diag(self, resp, X, nk, means, reg_covar):
|
|
266
|
+
"""Estimate the diagonal covariance vectors.
|
|
267
|
+
|
|
268
|
+
Parameters
|
|
269
|
+
----------
|
|
270
|
+
responsibilities : array-like of shape (n_samples, n_components)
|
|
271
|
+
|
|
272
|
+
X : array-like of shape (n_samples, n_features)
|
|
273
|
+
|
|
274
|
+
nk : array-like of shape (n_components,)
|
|
275
|
+
|
|
276
|
+
means : array-like of shape (n_components, n_features)
|
|
277
|
+
|
|
278
|
+
reg_covar : float
|
|
279
|
+
|
|
280
|
+
Returns
|
|
281
|
+
-------
|
|
282
|
+
covariances : array, shape (n_components, n_features)
|
|
283
|
+
The covariance vector of the current components.
|
|
284
|
+
"""
|
|
285
|
+
#X = X * self._counts
|
|
286
|
+
avg_X2 = np.dot((resp).T, (X * X*self._counts) ) / nk[:, np.newaxis]
|
|
287
|
+
avg_means2 = means ** 2
|
|
288
|
+
avg_X_means = means * np.dot(resp.T, X*self._counts) / nk[:, np.newaxis]
|
|
289
|
+
return avg_X2 - 2 * avg_X_means + avg_means2 + reg_covar
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _estimate_gaussian_parameters(self, X, resp, reg_covar, covariance_type):
|
|
293
|
+
"""Estimate the Gaussian distribution parameters.
|
|
294
|
+
|
|
295
|
+
Parameters
|
|
296
|
+
----------
|
|
297
|
+
X : array-like of shape (n_samples, n_features)
|
|
298
|
+
The input data array.
|
|
299
|
+
|
|
300
|
+
resp : array-like of shape (n_samples, n_components)
|
|
301
|
+
The responsibilities for each data sample in X.
|
|
302
|
+
|
|
303
|
+
reg_covar : float
|
|
304
|
+
The regularization added to the diagonal of the covariance matrices.
|
|
305
|
+
|
|
306
|
+
covariance_type : {'full', 'tied', 'diag', 'spherical'}
|
|
307
|
+
The type of precision matrices.
|
|
308
|
+
|
|
309
|
+
Returns
|
|
310
|
+
-------
|
|
311
|
+
nk : array-like of shape (n_components,)
|
|
312
|
+
The numbers of data samples in the current components.
|
|
313
|
+
|
|
314
|
+
means : array-like of shape (n_components, n_features)
|
|
315
|
+
The centers of the current components.
|
|
316
|
+
|
|
317
|
+
covariances : array-like
|
|
318
|
+
The covariance matrix of the current components.
|
|
319
|
+
The shape depends of the covariance_type.
|
|
320
|
+
"""
|
|
321
|
+
nk = (resp*self._counts).sum(axis=0) + 10 * np.finfo(resp.dtype).eps
|
|
322
|
+
means = np.dot(resp.T, X*self._counts)/nk[:,np.newaxis]
|
|
323
|
+
covariances = {"diag": self._estimate_gaussian_covariances_diag
|
|
324
|
+
}[covariance_type](resp, X, nk, means, reg_covar)
|
|
325
|
+
return nk, means, covariances
|
|
326
|
+
|
|
327
|
+
def _compute_precision_cholesky(self, covariances, covariance_type):
|
|
328
|
+
"""Compute the Cholesky decomposition of the precisions.
|
|
329
|
+
|
|
330
|
+
Parameters
|
|
331
|
+
----------
|
|
332
|
+
covariances : array-like
|
|
333
|
+
The covariance matrix of the current components.
|
|
334
|
+
The shape depends of the covariance_type.
|
|
335
|
+
|
|
336
|
+
covariance_type : {'full', 'tied', 'diag', 'spherical'}
|
|
337
|
+
The type of precision matrices.
|
|
338
|
+
|
|
339
|
+
Returns
|
|
340
|
+
-------
|
|
341
|
+
precisions_cholesky : array-like
|
|
342
|
+
The cholesky decomposition of sample precisions of the current
|
|
343
|
+
components. The shape depends of the covariance_type.
|
|
344
|
+
"""
|
|
345
|
+
estimate_precision_error_message = (
|
|
346
|
+
"Fitting the mixture model failed because some components have "
|
|
347
|
+
"ill-defined empirical covariance (for instance caused by singleton "
|
|
348
|
+
"or collapsed samples). Try to decrease the number of components, "
|
|
349
|
+
"or increase reg_covar.")
|
|
350
|
+
|
|
351
|
+
if covariance_type == 'full':
|
|
352
|
+
n_components, n_features, _ = covariances.shape
|
|
353
|
+
precisions_chol = np.empty((n_components, n_features, n_features))
|
|
354
|
+
for k, covariance in enumerate(covariances):
|
|
355
|
+
try:
|
|
356
|
+
cov_chol = linalg.cholesky(covariance, lower=True)
|
|
357
|
+
except linalg.LinAlgError:
|
|
358
|
+
raise ValueError(estimate_precision_error_message)
|
|
359
|
+
precisions_chol[k] = linalg.solve_triangular(cov_chol,
|
|
360
|
+
np.eye(n_features),
|
|
361
|
+
lower=True).T
|
|
362
|
+
elif covariance_type == 'tied':
|
|
363
|
+
_, n_features = covariances.shape
|
|
364
|
+
try:
|
|
365
|
+
cov_chol = linalg.cholesky(covariances, lower=True)
|
|
366
|
+
except linalg.LinAlgError:
|
|
367
|
+
raise ValueError(estimate_precision_error_message)
|
|
368
|
+
precisions_chol = linalg.solve_triangular(cov_chol, np.eye(n_features),
|
|
369
|
+
lower=True).T
|
|
370
|
+
else:
|
|
371
|
+
if np.any(np.less_equal(covariances, 0.0)):
|
|
372
|
+
raise ValueError(estimate_precision_error_message)
|
|
373
|
+
precisions_chol = 1. / np.sqrt(covariances)
|
|
374
|
+
return precisions_chol
|
|
375
|
+
|
|
376
|
+
###############################################################################
|
|
377
|
+
# Gaussian mixture probability estimators
|
|
378
|
+
def _compute_log_det_cholesky(self, matrix_chol, covariance_type, n_features):
|
|
379
|
+
"""Compute the log-det of the cholesky decomposition of matrices.
|
|
380
|
+
"""
|
|
381
|
+
|
|
382
|
+
if covariance_type == 'diag':
|
|
383
|
+
log_det_chol = (np.sum(np.log(matrix_chol), axis=1))
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
return log_det_chol
|
|
387
|
+
|
|
388
|
+
def _estimate_log_gaussian_prob(self, X, means, precisions_chol, covariance_type):
|
|
389
|
+
"""Estimate the log Gaussian probability.
|
|
390
|
+
|
|
391
|
+
Parameters
|
|
392
|
+
----------
|
|
393
|
+
X : array-like of shape (n_samples, n_features)
|
|
394
|
+
|
|
395
|
+
means : array-like of shape (n_components, n_features)
|
|
396
|
+
|
|
397
|
+
precisions_chol : array-like
|
|
398
|
+
Cholesky decompositions of the precision matrices.
|
|
399
|
+
'full' : shape of (n_components, n_features, n_features)
|
|
400
|
+
'tied' : shape of (n_features, n_features)
|
|
401
|
+
'diag' : shape of (n_components, n_features)
|
|
402
|
+
'spherical' : shape of (n_components,)
|
|
403
|
+
|
|
404
|
+
covariance_type : {'full', 'tied', 'diag', 'spherical'}
|
|
405
|
+
|
|
406
|
+
Returns
|
|
407
|
+
-------
|
|
408
|
+
log_prob : array, shape (n_samples, n_components)
|
|
409
|
+
"""
|
|
410
|
+
_, n_features = X.shape
|
|
411
|
+
n_components, _ = means.shape
|
|
412
|
+
# det(precision_chol) is half of det(precision)
|
|
413
|
+
log_det = self._compute_log_det_cholesky(
|
|
414
|
+
precisions_chol, covariance_type, n_features)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
if covariance_type == 'diag':
|
|
418
|
+
precisions = precisions_chol ** 2
|
|
419
|
+
#if self._counts is not None:
|
|
420
|
+
# X = X*self._counts
|
|
421
|
+
log_prob = (np.sum((means ** 2 * precisions), 1) -
|
|
422
|
+
2. * np.dot(X, (means * precisions).T) +
|
|
423
|
+
np.dot(X ** 2, precisions.T))
|
|
424
|
+
if self._counts is not None:
|
|
425
|
+
log_prob *= self._counts
|
|
426
|
+
|
|
427
|
+
return -.5 * (n_features * np.log(2 * np.pi) + log_prob) + log_det
|
|
428
|
+
|
|
429
|
+
def fit(self, X, y=None, counts = None, total_data_kmeans=None):
|
|
430
|
+
"""Estimate model parameters with the EM algorithm.
|
|
431
|
+
"""
|
|
432
|
+
if counts is not None:
|
|
433
|
+
self._counts = counts.reshape(-1,1)
|
|
434
|
+
self._total_data_kmeans = total_data_kmeans
|
|
435
|
+
self.fit_predict(X, y, counts)
|
|
436
|
+
self._counts = None
|
|
437
|
+
return self
|
|
438
|
+
|
|
439
|
+
def score_samples(self, X):
|
|
440
|
+
"""Compute the weighted log probabilities for each sample.
|
|
441
|
+
|
|
442
|
+
"""
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
return logsumexp(self._estimate_weighted_log_prob(X), axis=1)
|
|
446
|
+
|
|
447
|
+
def _print_verbose_msg_init_beg(self, n_init):
|
|
448
|
+
"""Print verbose message on initialization."""
|
|
449
|
+
if self.verbose == 1:
|
|
450
|
+
print("Initialization %d" % n_init)
|
|
451
|
+
elif self.verbose >= 2:
|
|
452
|
+
print("Initialization %d" % n_init)
|
|
453
|
+
self._init_prev_time = time()
|
|
454
|
+
self._iter_prev_time = self._init_prev_time
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
def _print_verbose_msg_iter_end(self, n_iter, diff_ll):
|
|
459
|
+
"""Print verbose message on initialization."""
|
|
460
|
+
if n_iter % self.verbose_interval == 0:
|
|
461
|
+
if self.verbose == 1:
|
|
462
|
+
print(" Iteration %d" % n_iter)
|
|
463
|
+
elif self.verbose >= 2:
|
|
464
|
+
cur_time = time()
|
|
465
|
+
print(" Iteration %d\t time lapse %.5fs\t ll change %.5f" % (
|
|
466
|
+
n_iter, cur_time - self._iter_prev_time, diff_ll))
|
|
467
|
+
self._iter_prev_time = cur_time
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def _initialize_parameters(self, X, random_state):
|
|
471
|
+
"""Initialize the model parameters.
|
|
472
|
+
|
|
473
|
+
Parameters
|
|
474
|
+
----------
|
|
475
|
+
X : array-like of shape (n_samples, n_features)
|
|
476
|
+
|
|
477
|
+
random_state : RandomState
|
|
478
|
+
A random number generator instance that controls the random seed
|
|
479
|
+
used for the method chosen to initialize the parameters.
|
|
480
|
+
"""
|
|
481
|
+
n_samples, _ = X.shape
|
|
482
|
+
|
|
483
|
+
if self.init_params == 'kmeans':
|
|
484
|
+
resp = np.zeros((n_samples, self.n_components))
|
|
485
|
+
km = KMeans(n_clusters=self.n_components, n_init=1,
|
|
486
|
+
random_state=random_state).fit(self._total_data_kmeans)
|
|
487
|
+
label = km.predict(X)
|
|
488
|
+
resp[np.arange(n_samples), label] = 1
|
|
489
|
+
elif self.init_params == 'random':
|
|
490
|
+
resp = random_state.rand(n_samples, self.n_components)
|
|
491
|
+
resp /= resp.sum(axis=1)[:, np.newaxis]
|
|
492
|
+
else:
|
|
493
|
+
raise ValueError("Unimplemented initialization method '%s'"
|
|
494
|
+
% self.init_params)
|
|
495
|
+
|
|
496
|
+
self._initialize(X, resp)
|
|
497
|
+
|
|
498
|
+
def _print_verbose_msg_init_end(self, ll):
|
|
499
|
+
"""Print verbose message on the end of iteration."""
|
|
500
|
+
if self.verbose == 1:
|
|
501
|
+
print("Initialization converged: %s" % self.converged_)
|
|
502
|
+
elif self.verbose >= 2:
|
|
503
|
+
print("Initialization converged: %s\t time lapse %.5fs\t ll %.5f" %
|
|
504
|
+
(self.converged_, time() - self._init_prev_time, ll))
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def fit_predict(self, X, y=None, counts = None):
|
|
508
|
+
"""Estimate model parameters using X and predict the labels for X.
|
|
509
|
+
"""
|
|
510
|
+
#X = _check_X(X, self.n_components, ensure_min_samples=2)
|
|
511
|
+
#self._check_n_features(X, reset=True)
|
|
512
|
+
#self._check_initial_parameters(X)
|
|
513
|
+
|
|
514
|
+
# if we enable warm_start, we will have a unique initialisation
|
|
515
|
+
do_init = not(self.warm_start and hasattr(self, 'converged_'))
|
|
516
|
+
n_init = self.n_init if do_init else 1
|
|
517
|
+
|
|
518
|
+
max_lower_bound = -np.infty
|
|
519
|
+
self.converged_ = False
|
|
520
|
+
|
|
521
|
+
random_state = np.random.RandomState(self.random_state)
|
|
522
|
+
|
|
523
|
+
n_samples, _ = X.shape
|
|
524
|
+
for init in range(n_init):
|
|
525
|
+
self._print_verbose_msg_init_beg(init)
|
|
526
|
+
|
|
527
|
+
if do_init:
|
|
528
|
+
self._initialize_parameters(X, random_state)
|
|
529
|
+
|
|
530
|
+
lower_bound = (-np.infty if do_init else self.lower_bound_)
|
|
531
|
+
|
|
532
|
+
for n_iter in range(1, self.max_iter + 1):
|
|
533
|
+
prev_lower_bound = lower_bound
|
|
534
|
+
|
|
535
|
+
log_prob_norm, log_resp = self._e_step(X, counts=counts)
|
|
536
|
+
self._m_step(X, log_resp)
|
|
537
|
+
lower_bound = self._compute_lower_bound(
|
|
538
|
+
log_resp, log_prob_norm)
|
|
539
|
+
|
|
540
|
+
change = lower_bound - prev_lower_bound
|
|
541
|
+
self._print_verbose_msg_iter_end(n_iter, change)
|
|
542
|
+
|
|
543
|
+
if abs(change) < self.tol:
|
|
544
|
+
self.converged_ = True
|
|
545
|
+
break
|
|
546
|
+
|
|
547
|
+
self._print_verbose_msg_init_end(lower_bound)
|
|
548
|
+
|
|
549
|
+
if lower_bound > max_lower_bound:
|
|
550
|
+
max_lower_bound = lower_bound
|
|
551
|
+
best_params = self._get_parameters()
|
|
552
|
+
best_n_iter = n_iter
|
|
553
|
+
|
|
554
|
+
if not self.converged_:
|
|
555
|
+
print('Initialization %d did not converge. '
|
|
556
|
+
'Try different init parameters, '
|
|
557
|
+
'or increase max_iter, tol '
|
|
558
|
+
'or check for degenerate data.'
|
|
559
|
+
% (init + 1))
|
|
560
|
+
|
|
561
|
+
self._set_parameters(best_params)
|
|
562
|
+
self.n_iter_ = best_n_iter
|
|
563
|
+
self.lower_bound_ = max_lower_bound
|
|
564
|
+
|
|
565
|
+
# Always do a final e-step to guarantee that the labels returned by
|
|
566
|
+
# fit_predict(X) are always consistent with fit(X).predict(X)
|
|
567
|
+
# for any value of max_iter and tol (and any random_state).
|
|
568
|
+
_, log_resp = self._e_step(X)
|
|
569
|
+
|
|
570
|
+
return log_resp.argmax(axis=1)
|
|
571
|
+
|
|
572
|
+
def _e_step(self, X, counts=None):
|
|
573
|
+
"""E step.
|
|
574
|
+
"""
|
|
575
|
+
log_prob_norm, log_resp = self._estimate_log_prob_resp(X)
|
|
576
|
+
return log_prob_norm.sum()/self._counts.sum(), log_resp
|
|
577
|
+
|
|
578
|
+
def _estimate_log_prob_resp(self, X):
|
|
579
|
+
"""Estimate log probabilities and responsibilities for each sample.
|
|
580
|
+
"""
|
|
581
|
+
weighted_log_prob = self._estimate_weighted_log_prob(X)
|
|
582
|
+
#if self._counts is not None:
|
|
583
|
+
# weighted_log_prob = self._counts * weighted_log_prob
|
|
584
|
+
log_prob_norm = logsumexp(weighted_log_prob, axis=1)
|
|
585
|
+
with np.errstate(under='ignore'):
|
|
586
|
+
# ignore underflow
|
|
587
|
+
log_resp = weighted_log_prob - log_prob_norm[:, np.newaxis]
|
|
588
|
+
return log_prob_norm, log_resp
|
|
589
|
+
|
|
590
|
+
def _estimate_weighted_log_prob(self, X):
|
|
591
|
+
"""Estimate the weighted log-probabilities, log P(X | Z) + log weights.
|
|
592
|
+
"""
|
|
593
|
+
return self._estimate_log_prob(X) + self._estimate_log_weights()
|
|
594
|
+
|
|
595
|
+
def _initialize(self, X, resp):
|
|
596
|
+
"""Initialization of the Gaussian mixture parameters.
|
|
597
|
+
|
|
598
|
+
Parameters
|
|
599
|
+
----------
|
|
600
|
+
X : array-like of shape (n_samples, n_features)
|
|
601
|
+
|
|
602
|
+
resp : array-like of shape (n_samples, n_components)
|
|
603
|
+
"""
|
|
604
|
+
n_samples= self._counts.sum()#X.shape
|
|
605
|
+
|
|
606
|
+
weights, means, covariances = self._estimate_gaussian_parameters(
|
|
607
|
+
X, resp, self.reg_covar, self.covariance_type)
|
|
608
|
+
weights /= n_samples
|
|
609
|
+
|
|
610
|
+
self.weights_ = (weights if self.weights_init is None
|
|
611
|
+
else self.weights_init)
|
|
612
|
+
self.means_ = means if self.means_init is None else self.means_init
|
|
613
|
+
|
|
614
|
+
if self.precisions_init is None:
|
|
615
|
+
self.covariances_ = covariances
|
|
616
|
+
self.precisions_cholesky_ = self._compute_precision_cholesky(
|
|
617
|
+
covariances, self.covariance_type)
|
|
618
|
+
elif self.covariance_type == 'full':
|
|
619
|
+
self.precisions_cholesky_ = np.array(
|
|
620
|
+
[linalg.cholesky(prec_init, lower=True)
|
|
621
|
+
for prec_init in self.precisions_init])
|
|
622
|
+
elif self.covariance_type == 'tied':
|
|
623
|
+
self.precisions_cholesky_ = linalg.cholesky(self.precisions_init,
|
|
624
|
+
lower=True)
|
|
625
|
+
else:
|
|
626
|
+
self.precisions_cholesky_ = self.precisions_init
|
|
627
|
+
|
|
628
|
+
def _m_step(self, X, log_resp):
|
|
629
|
+
"""M step.
|
|
630
|
+
|
|
631
|
+
Parameters
|
|
632
|
+
----------
|
|
633
|
+
X : array-like of shape (n_samples, n_features)
|
|
634
|
+
|
|
635
|
+
log_resp : array-like of shape (n_samples, n_components)
|
|
636
|
+
Logarithm of the posterior probabilities (or responsibilities) of
|
|
637
|
+
the point of each sample in X.
|
|
638
|
+
"""
|
|
639
|
+
n_samples = self._counts.sum()#X.shape
|
|
640
|
+
self.weights_, self.means_, self.covariances_ = (
|
|
641
|
+
self._estimate_gaussian_parameters(X, np.exp(log_resp), self.reg_covar,
|
|
642
|
+
self.covariance_type))
|
|
643
|
+
self.weights_ /= n_samples
|
|
644
|
+
self.precisions_cholesky_ = self._compute_precision_cholesky(
|
|
645
|
+
self.covariances_, self.covariance_type)
|
|
646
|
+
|
|
647
|
+
def _estimate_log_prob(self, X):
|
|
648
|
+
return self._estimate_log_gaussian_prob(
|
|
649
|
+
X, self.means_, self.precisions_cholesky_, self.covariance_type)
|
|
650
|
+
|
|
651
|
+
def _estimate_log_weights(self):
|
|
652
|
+
return np.log(self.weights_)
|
|
653
|
+
|
|
654
|
+
def _compute_lower_bound(self, _, log_prob_norm):
|
|
655
|
+
return log_prob_norm
|
|
656
|
+
|
|
657
|
+
def _get_parameters(self):
|
|
658
|
+
return (self.weights_, self.means_, self.covariances_,
|
|
659
|
+
self.precisions_cholesky_)
|
|
660
|
+
|
|
661
|
+
def _set_parameters(self, params):
|
|
662
|
+
(self.weights_, self.means_, self.covariances_,
|
|
663
|
+
self.precisions_cholesky_) = params
|
|
664
|
+
|
|
665
|
+
# Attributes computation
|
|
666
|
+
_, n_features = self.means_.shape
|
|
667
|
+
|
|
668
|
+
if self.covariance_type == 'full':
|
|
669
|
+
self.precisions_ = np.empty(self.precisions_cholesky_.shape)
|
|
670
|
+
for k, prec_chol in enumerate(self.precisions_cholesky_):
|
|
671
|
+
self.precisions_[k] = np.dot(prec_chol, prec_chol.T)
|
|
672
|
+
|
|
673
|
+
elif self.covariance_type == 'tied':
|
|
674
|
+
self.precisions_ = np.dot(self.precisions_cholesky_,
|
|
675
|
+
self.precisions_cholesky_.T)
|
|
676
|
+
else:
|
|
677
|
+
self.precisions_ = self.precisions_cholesky_ ** 2
|
|
678
|
+
|
|
679
|
+
def _n_parameters(self):
|
|
680
|
+
"""Return the number of free parameters in the model."""
|
|
681
|
+
_, n_features = self.means_.shape
|
|
682
|
+
if self.covariance_type == 'full':
|
|
683
|
+
cov_params = self.n_components * n_features * (n_features + 1) / 2.
|
|
684
|
+
elif self.covariance_type == 'diag':
|
|
685
|
+
cov_params = self.n_components * n_features
|
|
686
|
+
elif self.covariance_type == 'tied':
|
|
687
|
+
cov_params = n_features * (n_features + 1) / 2.
|
|
688
|
+
elif self.covariance_type == 'spherical':
|
|
689
|
+
cov_params = self.n_components
|
|
690
|
+
mean_params = n_features * self.n_components
|
|
691
|
+
return int(cov_params + mean_params + self.n_components - 1)
|
|
692
|
+
|
|
693
|
+
def bic(self, X):
|
|
694
|
+
"""Bayesian information criterion for the current model on the input X.
|
|
695
|
+
|
|
696
|
+
Parameters
|
|
697
|
+
----------
|
|
698
|
+
X : array of shape (n_samples, n_dimensions)
|
|
699
|
+
|
|
700
|
+
Returns
|
|
701
|
+
-------
|
|
702
|
+
bic : float
|
|
703
|
+
The lower the better.
|
|
704
|
+
"""
|
|
705
|
+
return (-2 * self.score(X) * X.shape[0] +
|
|
706
|
+
self._n_parameters() * np.log(X.shape[0]))
|
|
707
|
+
|
|
708
|
+
def aic(self, X):
|
|
709
|
+
"""Akaike information criterion for the current model on the input X.
|
|
710
|
+
|
|
711
|
+
Parameters
|
|
712
|
+
----------
|
|
713
|
+
X : array of shape (n_samples, n_dimensions)
|
|
714
|
+
|
|
715
|
+
Returns
|
|
716
|
+
-------
|
|
717
|
+
aic : float
|
|
718
|
+
The lower the better.
|
|
719
|
+
"""
|
|
720
|
+
return -2 * self.score(X) * X.shape[0] + 2 * self._n_parameters()
|