Why is initialize public?

I am using Initializable.sol in order to use the minimal proxy pattern. However, I don't understand why the initialize function (example below from OZ docs) is public rather than external. It seems like the contract will never call its own initialize but instead another contract will. What am I missing?

// contracts/MyContract.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;

import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

contract MyContract is Initializable {
    function initialize(
        address arg1,
        uint256 arg2,
        bytes memory arg3
    ) public payable initializer {
        // "constructor" code...
    }
}

We use public because it can be useful to call the function internally if you extend it via inheritance. But don't think too much about it. You can write an external initializer as well.