きっかけ
Spartの動きがなんとなく分かったので、次の機械学習へ。
環境
IntelliJ IDEA 2019.1 (Community Edition) Build #IC-191.6183.87, built on March 27, 2019 JRE: 11.0.2+9-b159.30 amd64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Windows 10 10.0
intellijって、開発環境を簡単に出せるのか。。。
知らなかった。
メニューバーの Help
→ About
で表示できる。
いっつも、コマンド打って転記してたけど、今度からこれでやったほうが早いな。
実験
build.graldeと実行ソース、データセットを晒しておけば十分かな?
build.gradle
plugins { id 'java' } group 'rssCollector' version '1.0-SNAPSHOT' sourceCompatibility = 11 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' // https://mvnrepository.com/artifact/org.apache.mahout/mahout-core compile group: 'org.apache.mahout', name: 'mahout-core', version: '0.9' }
data.csv
1,1243,3.3 1,1240,0.3 1,1242,1.2 2,1242,1.3 2,1243,1.9 2,1241,2.8 2,1245,4.3 3,1240,0.6 3,1242,1.0 3,1241,2.3 3,1245,3.0
sample
本当は、先頭大文字にすべきだけど、多めにみて。。。
import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; import org.apache.mahout.cf.taste.recommender.RecommendedItem; import org.apache.mahout.cf.taste.recommender.Recommender; import org.apache.mahout.cf.taste.similarity.UserSimilarity; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.List; public class sample { public static void main(String[] args) throws IOException, TasteException, URISyntaxException { URL url = ClassLoader.getSystemResource("data.csv"); DataModel model = new FileDataModel(new File(url.toURI())); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); // ユーザID:1の人に3件レコメンド List<RecommendedItem> recommendations = recommender.recommend(1, 3); recommendations.forEach(System.out::println); } }
実行
実行すると、下記みたいなのがでるはず。
RecommendedItem[item:1245, value:3.65] RecommendedItem[item:1241, value:2.55]
3件指定したけど、2件しか出てこないのは、データが少なすぎるせいらしい。
感想
sparkなくても、レコメンドとかできるのか。。。。
すごく楽にレコメンドとか実装できてしまって、hadoopの実行環境作るのに悩んでいたのは何だったんだと思いたくなる。
他のサイト見ていたけど、 UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
のところで、 PearsonCorrelationSimilarity
以外のアルゴリズムを適用させて、いろいろ分析方法を返るみたい。
当然、後続で利用するクラスも変わるわけだが。。。
利用するアルゴリズムは、統計学の知識がないと、よく分からなかった。
体系的に統計学を学ばないと、ググって調べた程度の知識量では、汎用的に使うのが難しそう。。。
あと、調べてると、やたらとscalaが出てくる。
時期的に見ると、Java8リリース前だから、JVM言語が出始めてきた頃だな。
Java8リリース前は、JVM言語の方が盛り上がってた印象がある。
Scalaは、なんとなく読めるけど、やっぱり、違和感はある。
そういえば、機械学習とかするときって、前処理が大変とよく聞くが、アルゴリズムを適用させるために、決まったデータフォーマットにするために大変ってことだろうか?
課題
- 統計学を学んで見る
参考サイト
Mahoutでレコメンドを作ってみよう! | Atlas Developers Blog