Вот более простая версия:
public <T> T callFriend(String name) {
return (T) friends.get(name); //Casting to T not needed in this case but its a good practice to do
}
Полностью рабочий код:
public class Test {
public static class Animal {
private Map<String,Animal> friends = new HashMap<>();
public void addFriend(String name, Animal animal){
friends.put(name,animal);
}
public <T> T callFriend(String name){
return (T) friends.get(name);
}
}
public static class Dog extends Animal {
public void bark() {
System.out.println("i am dog");
}
}
public static class Duck extends Animal {
public void quack() {
System.out.println("i am duck");
}
}
public static void main(String [] args) {
Animal animals = new Animal();
animals.addFriend("dog", new Dog());
animals.addFriend("duck", new Duck());
Dog dog = animals.callFriend("dog");
dog.bark();
Duck duck = animals.callFriend("duck");
duck.quack();
}
}
Стандартная рекомендация для учебника по SVM - это Учебник по машинам опорных векторов для распознавания образов Кристофера Берджеса. Еще одно хорошее место для изучения SVM - это курс машинного обучения в Стэнфорде (SVM рассматриваются в лекциях 6-8). Оба они довольно теоретические и тяжелые по математике.
Что касается исходного кода; SVMLight , libsvm и TinySVM - все с открытым исходным кодом, но код не очень прост. Я не рассматривал каждый из них очень внимательно, но исходный код TinySVM, вероятно, самый простой для понимания. Также имеется реализация псевдокода алгоритма SMO в этой статье .
Предполагая, что вы знаете основы (например, классификаторы максимальной маржи, построение ядра), решите набор задач 2 (раздаточный материал № 5) из этого стэнфордского курса машинного обучения. Есть ключи ответа, и он держит вас за руку на протяжении всего процесса. Используйте Примечания к лекциям 3 и видео № 7-8 как ссылки.
Если вы не знаете основ, посмотрите предыдущие видео.
Практическое руководство по классификации SVM для libsvm
PyML Tutorial для PyML
Я думаю, что 1 практичен для использования, 3 ясен для понимания.
Я бы взял копию R , установил пакет e1071 , который прекрасно обертывает libsvm , и попытался получить хорошее результаты на ваших любимых наборах данных.
Если вы только что разобрались с PCA, было бы полезно посмотреть на данные с гораздо большим количеством предикторов, чем случаев (например, профили экспрессии генов микроматрицы, временные ряды, спектры из аналитической химии и т. д.) и сравнить линейную регрессию на предикторах PCA с SVM на необработанных предикторах.
В других ответах есть много отличных ссылок, но я думаю, что есть смысл поиграть с черным ящиком, прежде чем вы прочитаете, что внутри.
Множество видеолекций по SVM:
http://videolectures.net/Top/Computer_Science/Machine_Learning/Kernel_Methods/Support_Vector_Machines/
Я нашел одну, написанную Колином Кэмпбелл , чтобы быть очень полезным.
Это очень хорошее руководство по SVM для новичков:
Я всегда думал, что рекомендованный StompChicken учебник немного сбивает с толку, так как они сразу переходят к разговору о границах и статистике VC и пытаются найти оптимальная машина и все такое. Однако хорошо, если вы уже разбираетесь в основах.