<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def clinical_kernel(x, y=None):
 """Computes clinical kernel The clinical kernel distinguishes between continuous ordinal,and nominal variables. Parameters x : pandas.DataFrame, shape = (n_samples_x, n_features) Training data y : pandas.DataFrame, shape = (n_samples_y, n_features) Testing data Returns ------- kernel : array, shape = (n_samples_x, n_samples_y) Kernel matrix. Values are normalized to lie within [0, 1]. References .. [1] Daemen, A., De Moor, B., "Development of a kernel function for clinical data". Annual International Conference of the IEEE Engineering in Medicine and Biology Society, 5913-7, 2009 """

    if y is not None:
        if x.shape[1] != y.shape[1]:
            raise ValueError('x and y have different number of features')
        if not x.columns.equals(y.columns):
            raise ValueError('columns do not match')
    else:
        y = x

    mat = numpy.zeros((x.shape[0], y.shape[0]), dtype=float)

    x_numeric, nominal_columns = _get_continuous_and_ordinal_array(x)
    if id(x) != id(y):
        y_numeric, _ = _get_continuous_and_ordinal_array(y)
    else:
        y_numeric = x_numeric

    continuous_ordinal_kernel(x_numeric, y_numeric, mat)
    _nominal_kernel(x.loc[:, nominal_columns].values,
                    y.loc[:, nominal_columns].values,
                    mat)
    mat /= x.shape[1]
    return mat