



from collections import Counter

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split

_lowerCamelCase						    =  datasets.load_iris()

_lowerCamelCase						    =  np.array(data["""data"""])
_lowerCamelCase						    =  np.array(data["""target"""])
_lowerCamelCase						    =  data["""target_names"""]

_lowerCamelCase    ,       _lowerCamelCase    ,       _lowerCamelCase    ,       _lowerCamelCase						    =  train_test_split(X, y)






def 	_lowerCAmelCase						(				__lowerCamelCase   :     int		,	__lowerCamelCase   :     List[Any]     ):



 """simple docstring"""





 return np.linalg.norm(np.array(__lowerCamelCase     ) - np.array(__lowerCamelCase     )     )






def 	_lowerCAmelCase						(				__lowerCamelCase   :     Union[str, Any]		,	__lowerCamelCase   :     str		,	__lowerCamelCase   :     Optional[int]		,	__lowerCamelCase   :     List[str]		,	__lowerCamelCase   :     Optional[Any]=5     ):



 """simple docstring"""





 __SCREAMING_SNAKE_CASE       :    Optional[int]       =	zip(__lowerCamelCase		,	__lowerCamelCase     )
 # List of distances of all points from the point to be classified
 __SCREAMING_SNAKE_CASE       :    Optional[int]       =	[]
 for data_point in data:
  __SCREAMING_SNAKE_CASE       :    List[Any]       =	euclidean_distance(data_point[0]		,	__lowerCamelCase     )
  distances.append((distance, data_point[1])     )
 # Choosing 'k' points with the least distances.
 __SCREAMING_SNAKE_CASE       :    Union[str, Any]       =	[i[1] for i in sorted(__lowerCamelCase     )[:k]]
 # Most commonly occurring class among them
 # is the class into which the point is classified
 __SCREAMING_SNAKE_CASE       :    List[str]       =	Counter(__lowerCamelCase     ).most_common(1     )[0][0]
 return classes[result]


if __name__ == "__main__":
 print(classifier(X_train, y_train, classes, [4.4, 3.1, 1.3, 1.4]))











from __future__ import annotations

import math
from collections import Counter
from string import ascii_lowercase






def 	_lowerCAmelCase						(				__lowerCamelCase   :     str     ):



 """simple docstring"""





 __SCREAMING_SNAKE_CASE,		__SCREAMING_SNAKE_CASE       :    Tuple       =	analyze_text(__lowerCamelCase     )
 __SCREAMING_SNAKE_CASE       :    List[Any]       =	list(" " + ascii_lowercase     )
 # what is our total sum of probabilities.
 __SCREAMING_SNAKE_CASE       :    int       =	sum(single_char_strings.values()     )

 # one length string
 __SCREAMING_SNAKE_CASE       :    str       =	0
 # for each alpha we go in our dict and if it is in it we calculate entropy
 for ch in my_alphas:
  if ch in single_char_strings:
   __SCREAMING_SNAKE_CASE       :    List[Any]       =	single_char_strings[ch]
   __SCREAMING_SNAKE_CASE       :    str       =	my_str / all_sum
   my_fir_sum += prob * math.loga(__lowerCamelCase     )  # entropy formula.

    # print entropy
 print(F"""{round(-1 * my_fir_sum     ):.1f}"""     )

 # two len string
 __SCREAMING_SNAKE_CASE       :    Optional[int]       =	sum(two_char_strings.values()     )
 __SCREAMING_SNAKE_CASE       :    int       =	0
 # for each alpha (two in size) calculate entropy.
 for cha in my_alphas:
  for cha in my_alphas:
   __SCREAMING_SNAKE_CASE       :    int       =	cha + cha
   if sequence in two_char_strings:
    __SCREAMING_SNAKE_CASE       :    Optional[Any]       =	two_char_strings[sequence]
    __SCREAMING_SNAKE_CASE       :    Union[str, Any]       =	int(__lowerCamelCase     ) / all_sum
    my_sec_sum += prob * math.loga(__lowerCamelCase     )

    # print second entropy
 print(F"""{round(-1 * my_sec_sum     ):.1f}"""     )

 # print the difference between them
 print(F"""{round((-1 * my_sec_sum) - (-1 * my_fir_sum)     ):.1f}"""     )






def 	_lowerCAmelCase						(				__lowerCamelCase   :     str     ):



 """simple docstring"""





 __SCREAMING_SNAKE_CASE       :    Any       =	Counter()  # type: ignore
 __SCREAMING_SNAKE_CASE       :    int       =	Counter()  # type: ignore
 single_char_strings[text[-1]] += 1

 # first case when we have space at start.
 two_char_strings[" " + text[0]] += 1
 for i in range(0		,	len(__lowerCamelCase     ) - 1     ):
  single_char_strings[text[i]] += 1
  two_char_strings[text[i : i + 2]] += 1
 return single_char_strings, two_char_strings






def 	_lowerCAmelCase						(				):



 """simple docstring"""





 import doctest

 doctest.testmod()
 # text = (
 #     "Had repulsive dashwoods suspicion sincerity but advantage now him. Remark "
 #     "easily garret nor nay. Civil those mrs enjoy shy fat merry. You greatest "
 #     "jointure saw horrible. He private he on be imagine suppose. Fertile "
 #     "beloved evident through no service elderly is. Blind there if every no so "
 #     "at. Own neglected you preferred way sincerity delivered his attempted. To "
 #     "of message cottage windows do besides against uncivil.  Delightful "
 #     "unreserved impossible few estimating men favourable see entreaties. She "
 #     "propriety immediate was improving. He or entrance humoured likewise "
 #     "moderate. Much nor game son say feel. Fat make met can must form into "
 #     "gate. Me we offending prevailed discovery. "
 # )

 # calculate_prob(text)


if __name__ == "__main__":
      main()






