No Description

b8c15ef50b89dc966683ac941b43562d0c44384e.svn-base 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. package com.rdlze.radializebase.utils;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
  6. /**
  7. *
  8. * @author Alex Amorim Dutra
  9. *
  10. */
  11. public class MathNervous {
  12. /**
  13. * Normaliza os valores do Map entre 0 e 1.
  14. *
  15. * @param idsValues
  16. * @return
  17. */
  18. public FastByIDMap<Float> normalizingValues(FastByIDMap<Float> idsValues) {
  19. float maxValue = -99999999;
  20. float minValue = 99999999;
  21. Iterator<Long> iteratorValues = idsValues.keySetIterator();
  22. while (iteratorValues.hasNext()) {
  23. long id = iteratorValues.next();
  24. float value = idsValues.get(id);
  25. if (maxValue < value)
  26. maxValue = value;
  27. if (minValue > value)
  28. minValue = value;
  29. idsValues.put(id, value);
  30. }
  31. FastByIDMap<Float> mapToReturn = new FastByIDMap<Float>();
  32. iteratorValues = idsValues.keySetIterator();
  33. while (iteratorValues.hasNext()) {
  34. long id = iteratorValues.next();
  35. float value = idsValues.get(id);
  36. float newValue = 0;
  37. if ((maxValue - minValue) == 0) {
  38. newValue = 0.0f;
  39. } else {
  40. newValue = (value - minValue) / (maxValue - minValue);
  41. }
  42. mapToReturn.put(id, newValue);
  43. }
  44. return mapToReturn;
  45. }
  46. /**
  47. * Normaliza os valores do Map entre o menor valor desejado e o maior valor
  48. * desejado.
  49. *
  50. * @param idsValues
  51. * @return
  52. */
  53. public FastByIDMap<Float> normalizingValues(FastByIDMap<Float> idsValues,
  54. float minValueDesired, float maxValueDesired) {
  55. float realMaxValue = -99999999;
  56. float realMinValue = 99999999;
  57. Iterator<Long> iteratorValues = idsValues.keySetIterator();
  58. while (iteratorValues.hasNext()) {
  59. long id = iteratorValues.next();
  60. float value = idsValues.get(id);
  61. if (realMaxValue < value)
  62. realMaxValue = value;
  63. if (realMinValue > value)
  64. realMinValue = value;
  65. idsValues.put(id, value);
  66. }
  67. FastByIDMap<Float> mapToReturn = new FastByIDMap<Float>();
  68. iteratorValues = idsValues.keySetIterator();
  69. while (iteratorValues.hasNext()) {
  70. long id = iteratorValues.next();
  71. float value = idsValues.get(id);
  72. float newValue = 0;
  73. if ((realMaxValue - realMinValue) == 0) {
  74. newValue = maxValueDesired;
  75. } else {
  76. newValue = minValueDesired
  77. + ((value - realMinValue) * (maxValueDesired - minValueDesired))
  78. / (realMaxValue - realMinValue);
  79. }
  80. mapToReturn.put(id, newValue);
  81. }
  82. return mapToReturn;
  83. }
  84. public FastByIDMap<Float> normalizingSortedList(
  85. List<AIRecommendedItem> listToNormalize) {
  86. float maxValue = 100;
  87. FastByIDMap<Float> mapToReturn = new FastByIDMap<Float>();
  88. for (AIRecommendedItem item : listToNormalize) {
  89. mapToReturn.put(item.getItemID(), maxValue);
  90. // evita que os valores ficam abaixo de 20, pois isto atrapalha para
  91. // mostrar no front-end.
  92. if (maxValue > 80)
  93. maxValue -= 4;
  94. else if (maxValue > 60)
  95. maxValue -= 3;
  96. else if (maxValue > 50)
  97. maxValue -= 2;
  98. else if (maxValue > 30)
  99. maxValue -= 1;
  100. else if (maxValue > 20)
  101. maxValue -= 0.5;
  102. }
  103. return mapToReturn;
  104. }
  105. public FastByIDMap<Float> normalizingSortedListRadio(
  106. List<AIRecommendedItem> listToNormalize) {
  107. // Pelo fato dos nomes das rádios serem maiores então é feita uma
  108. // normalização mais agressiva quanto as diferenças de valores.
  109. float maxValue = 100;
  110. FastByIDMap<Float> mapToReturn = new FastByIDMap<Float>();
  111. for (AIRecommendedItem item : listToNormalize) {
  112. mapToReturn.put(item.getItemID(), maxValue);
  113. if (maxValue > 89)
  114. maxValue -= 5;
  115. else if (maxValue > 60)
  116. maxValue -= 4;
  117. else if (maxValue > 40)
  118. maxValue -= 3;
  119. else if (maxValue > 30)
  120. maxValue -= 1.5;
  121. else if (maxValue > 20)
  122. maxValue -= 0.5;
  123. }
  124. return mapToReturn;
  125. }
  126. /**
  127. * Normaliza os valores utilizando ZScore.
  128. *
  129. * @param idValue
  130. * @return
  131. */
  132. public FastByIDMap<Float> normalizingValuesZScore(FastByIDMap<Float> idValue) {
  133. List<Float> values = new ArrayList<Float>();
  134. Iterator<Long> iteratorValues = idValue.keySetIterator();
  135. while (iteratorValues.hasNext()) {
  136. long id = iteratorValues.next();
  137. float value = idValue.get(id);
  138. values.add(value);
  139. idValue.put(id, value);
  140. }
  141. float mean = getMean(values);
  142. float desvPad = getStandardDeviation(values);
  143. FastByIDMap<Float> mapReturn = new FastByIDMap<Float>();
  144. iteratorValues = idValue.keySetIterator();
  145. while (iteratorValues.hasNext()) {
  146. long id = iteratorValues.next();
  147. float value = idValue.get(id);
  148. float newValue = (value - mean) / desvPad;
  149. mapReturn.put(id, newValue);
  150. if (Float.isNaN(value))
  151. value = 0.f;
  152. idValue.put(id, value);
  153. }
  154. return mapReturn;
  155. }
  156. /**
  157. * Calcula a media dos valores.
  158. *
  159. * @param values
  160. * @return
  161. */
  162. public float getMean(List<Float> values) {
  163. float totalValue = 0;
  164. for (Float value : values)
  165. totalValue += value;
  166. if (totalValue == 0)
  167. return 0;
  168. return totalValue / values.size();
  169. }
  170. /**
  171. * Calcula o desvio padrao dos valores.
  172. *
  173. * @param values
  174. * @return
  175. */
  176. public float getStandardDeviation(List<Float> values) {
  177. float mean = getMean(values);
  178. float totalValue = 0;
  179. for (Float value : values) {
  180. totalValue += Math.pow((value - mean), 2);
  181. }
  182. float desvPad = (float) Math.sqrt(totalValue / (values.size() - 1));
  183. return desvPad;
  184. }
  185. /**
  186. * Cada item contem uma lista de valores de Features.
  187. *
  188. * @param idValuesFeatures
  189. * @return
  190. */
  191. public FastByIDMap<List<Float>> normalizingValuesMap(
  192. FastByIDMap<List<Float>> idValuesFeatures) {
  193. FastByIDMap<List<Float>> valuesNormalized = new FastByIDMap<List<Float>>();
  194. // normaliza feature por feature de cada item.
  195. // primeira feature itera sobre todos itens.
  196. int size = 1;
  197. for (int i = 0; i < size; i++) {
  198. FastByIDMap<Float> idValue = new FastByIDMap<Float>();
  199. Iterator<Long> iteratorIds = idValuesFeatures.keySetIterator();
  200. while (iteratorIds.hasNext()) {
  201. long id = iteratorIds.next();
  202. List<Float> features = idValuesFeatures.get(id);
  203. size = features.size();
  204. float value = features.get(i);
  205. idValue.put(id, value);
  206. }
  207. FastByIDMap<Float> mapReturn = normalizingValues(idValue);
  208. iteratorIds = mapReturn.keySetIterator();
  209. while (iteratorIds.hasNext()) {
  210. long id = iteratorIds.next();
  211. float value = mapReturn.get(id);
  212. List<Float> features = idValuesFeatures.get(id);
  213. // setando o valor normalizado
  214. features.set(i, value);
  215. valuesNormalized.put(id, features);
  216. }
  217. }
  218. return valuesNormalized;
  219. }
  220. /**
  221. * Cada item contem uma lista de valores de Features.
  222. *
  223. * @param idValuesFeatures
  224. * @return
  225. */
  226. public FastByIDMap<List<Float>> normalizingValuesZScoreMap(
  227. FastByIDMap<List<Float>> idValuesFeatures) {
  228. FastByIDMap<List<Float>> valuesNormalized = new FastByIDMap<List<Float>>();
  229. // normaliza feature por feature de cada item.
  230. // primeira feature itera sobre todos itens.
  231. int size = 1;
  232. for (int i = 0; i < size; i++) {
  233. FastByIDMap<Float> idValue = new FastByIDMap<Float>();
  234. Iterator<Long> iteratorIds = idValuesFeatures.keySetIterator();
  235. while (iteratorIds.hasNext()) {
  236. long id = iteratorIds.next();
  237. List<Float> features = idValuesFeatures.get(id);
  238. size = features.size();
  239. float value = features.get(i);
  240. if (Float.isNaN(value))
  241. value = 0.0f;
  242. idValue.put(id, value);
  243. }
  244. FastByIDMap<Float> mapReturn = normalizingValuesZScore(idValue);
  245. iteratorIds = mapReturn.keySetIterator();
  246. while (iteratorIds.hasNext()) {
  247. long id = iteratorIds.next();
  248. float value = mapReturn.get(id);
  249. List<Float> features = idValuesFeatures.get(id);
  250. // setando o valor normalizado
  251. if (Float.isNaN(value))
  252. value = 0.0f;
  253. features.set(i, value);
  254. valuesNormalized.put(id, features);
  255. }
  256. }
  257. return valuesNormalized;
  258. }
  259. public float getMax(List<Float> values) {
  260. float max = -99999999999999999999999999999999999999.f;
  261. for (float value : values) {
  262. if (max < value)
  263. max = value;
  264. }
  265. return max;
  266. }
  267. public float getMin(List<Float> values) {
  268. float min = 99999999999999999999999999999999999999.f;
  269. for (float value : values) {
  270. if (min > value)
  271. min = value;
  272. }
  273. return min;
  274. }
  275. public float getCoefficientVariation(List<Float> values) {
  276. float mean = getMean(values);
  277. float totalValue = 0;
  278. for (Float value : values)
  279. totalValue += Math.pow((value - mean), 2);
  280. float desvPad = (float) Math.sqrt(totalValue / (values.size() - 1));
  281. float cv = desvPad / mean;
  282. return cv;
  283. }
  284. public double normalizingValues(double value, double realMinValue,
  285. double realMaxValue, double minValueDesired, double maxValueDesired) {
  286. double newValue = 0;
  287. if ((realMaxValue - realMinValue) == 0) {
  288. newValue = minValueDesired;
  289. } else {
  290. newValue = minValueDesired
  291. + ((value - realMinValue) * (maxValueDesired - minValueDesired))
  292. / (realMaxValue - realMinValue);
  293. }
  294. // if (newValue < value)
  295. // System.out.println("MINVALUEDESIRED " + minValueDesired
  296. // + " VALUE " + value + " MAXVALUEDESIRED "
  297. // + maxValueDesired + " REALMINVALUE " + realMinValue
  298. // + " REALMAXVALUE " + realMaxValue+" NEWVALUE "+newValue);
  299. return newValue;
  300. }
  301. public static void main(String[] args) {
  302. List<Float> values = new ArrayList<Float>();
  303. values.add(2.f);
  304. values.add(2.f);
  305. values.add(2.f);
  306. values.add(120.f);
  307. MathNervous normalizing = new MathNervous();
  308. double realMinValue = 0.2;
  309. System.out.println("OKK "
  310. + normalizing.normalizingValues(0.27, realMinValue, 0.27,
  311. realMinValue, 40));
  312. System.out.println("Mean " + normalizing.getMean(values));
  313. System.out.println("DesvPad "
  314. + normalizing.getStandardDeviation(values));
  315. FastByIDMap<Float> idValue = new FastByIDMap<Float>();
  316. idValue.put(1, 0.f);
  317. idValue.put(2, 2.f);
  318. idValue.put(3, 500.f);
  319. idValue.put(4, 1000.f);
  320. System.out.println("Normalizing "
  321. + normalizing.normalizingValues(idValue));
  322. System.out.println("Normalizing Min and Max "
  323. + normalizing.normalizingValues(idValue, 1, 80));
  324. System.out.println("ZScore "
  325. + normalizing.normalizingValuesZScore(idValue));
  326. }
  327. }