#一,自己写KNN

df<-read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\10-Recommendations\\data\\example_data.csv')
head(df)

#得出距离矩阵
distance.matrix <- function(df)
{

#生成一万个NA,并转成100*100的矩阵
distance <- matrix(rep(NA, nrow(df) ^ 2), nrow = nrow(df))

#计算两两之间的欧氏距离

for (i in 1:nrow(df))

{
for (j in 1:nrow(df))
{
distance[i, j] <- sqrt((df[i, 'X'] - df[j, 'X']) ^ 2 + (df[i, 'Y'] - df[j, 'Y']) ^ 2)
}
}
return(distance)
}

#查找与数据点i距离最短的前k个点
k.nearest.neighbors <- function(i, distance, k = 5)
{

#distance[i, ]是所有点与点i的距离,排个序,取K个下标,从2开始的原因是排第1位的就是是数据点i自己
return(order(distance[i, ])[2:(k + 1)])
}

#得出预测值
knn <- function(df, k = 5)
{

#得出距离矩阵
distance <- distance.matrix(df)

#predictions存NA
predictions <- rep(NA, nrow(df))
for (i in 1:nrow(df))
{

#得出与i最近的K个点的下标
indices <- k.nearest.neighbors(i, distance, k = k)

#均值大于0.5赋1.否则赋0
predictions[i] <- ifelse(mean(df[indices, 'Label']) > 0.5, 1, 0)
}
return(predictions)
}

#添加预测列
df <- transform(df, kNNPredictions = knn(df))

#以下是计算预测错误的个数,共7个,总共也就100个,正确率是93%
sum(with(df, Label != kNNPredictions))
#把刚才自己写的KNN函数删除
rm('knn')

#二、以下才是用R中的函数来做KNN

library('class')
df<-read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\10-Recommendations\\data\\example_data.csv')
n <- nrow(df)
set.seed(1)

#从1到n中随机抽一半作为训练集,剩下的为测试集
indices <- sort(sample(1:n, n * (1 / 2)))
training.x <- df[indices, 1:2]
test.x <- df[-indices, 1:2]
training.y <- df[indices, 3]
test.y <- df[-indices, 3]
# There's a bug here!
predicted.y <- knn(training.x, test.x, training.y, k = 5)

#预测错了7个点,但测试集才50条观测行,因此正确率86%
sum(predicted.y != test.y)

#下面看看逻辑回归
logit.model <- glm(Label ~ X + Y, data = df[indices, ])
predictions <- as.numeric(predict(logit.model, newdata = df[-indices, ]) > 0)
sum(predictions != test.y)

#结果是50行预测错了16个点,正确率只有68%,因此结论是如果问题完全不是线性时,K近邻的表现好过GLM

#三、以下进行推荐案例,用Kaggle的数据,根据一个程序员已经安装的程序包来预测这个程序员是否会安装另一个程序包

installations <- read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\10-Recommendations\\data\\installations.csv')
head(installations)
library('reshape')

#数据集中共三列,分别是Package,User,Installed

#cast函数的作用:将数据集中的数据,User为行,Package为列,值为是否安装

#结果矩阵中,第一列是用户名

user.package.matrix <- cast(installations, User ~ Package, value = 'Installed')

row.names(user.package.matrix) <- user.package.matrix[, 1]

user.package.matrix <- user.package.matrix[, -1]

#计算一下相关性

similarities <- cor(user.package.matrix)

#把相似度转换为距离矩阵,把相似度1转换为距离0,把相似度-1转换为距离无穷大
distances <- -log((similarities / 2) + 0.5)

#返回与数据点i最近的K个点的下标

k.nearest.neighbors <- function(i, distances, k = 25)
{
return(order(distances[i, ])[2:(k + 1)])
}

installation.probability <- function(user, package, user.package.matrix, distances, k = 25)
{
neighbors <- k.nearest.neighbors(package, distances, k = k)
return(mean(sapply(neighbors, function (neighbor) {user.package.matrix[user, neighbor]})))
}

#对于用户1有多少概率安装程序包1

installation.probability(1, 1, user.package.matrix, distances)

#计算出用户最可能安装的程序包,按概率排序

most.probable.packages <- function(user, user.package.matrix, distances, k = 25)
{
return(order(sapply(1:ncol(user.package.matrix),
function (package)
{
installation.probability(user,
package,
user.package.matrix,
distances,
k = k)
}),
decreasing = TRUE))
}

user <- 1

listing <- most.probable.packages(user, user.package.matrix, distances)

colnames(user.package.matrix)[listing[1:10]]

Machine Learning for hackers读书笔记(十)KNN:推荐系统的更多相关文章

  1. Machine Learning for hackers读书笔记(十二)模型比较

    library('ggplot2')df <- read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\12-Model_C ...

  2. Machine Learning for hackers读书笔记(七)优化:密码破译

    #凯撒密码:将每一个字母替换为字母表中下一位字母,比如a变成b. english.letters <- c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' ...

  3. Machine Learning for hackers读书笔记(六)正则化:文本回归

    data<-'F:\\learning\\ML_for_Hackers\\ML_for_Hackers-master\\06-Regularization\\data\\' ranks < ...

  4. Machine Learning for hackers读书笔记(三)分类:垃圾邮件过滤

    #定义函数,打开每一个文件,找到空行,将空行后的文本返回为一个字符串向量,该向量只有一个元素,就是空行之后的所有文本拼接之后的字符串 #很多邮件都包含了非ASCII字符,因此设为latin1就可以读取 ...

  5. Machine Learning for hackers读书笔记_一句很重要的话

    为了培养一个机器学习领域专家那样的直觉,最好的办法就是,对你遇到的每一个机器学习问题,把所有的算法试个遍,直到有一天,你凭直觉就知道某些算法行不通.

  6. Machine Learning for hackers读书笔记(九)MDS:可视化地研究参议员相似性

    library('foreign') library('ggplot2') data.dir <- file.path('G:\\dataguru\\ML_for_Hackers\\ML_for ...

  7. Machine Learning for hackers读书笔记(八)PCA:构建股票市场指数

    library('ggplot2') prices <- read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\08-PC ...

  8. Machine Learning for hackers读书笔记(五)回归模型:预测网页访问量

    线性回归函数 model<-lm(Weight~Height,data=?) coef(model):得到回归直线的截距 predict(model):预测 residuals(model):残 ...

  9. Machine Learning for hackers读书笔记(四)排序:智能收件箱

    #数据集来源http://spamassassin.apache.org/publiccorpus/ #加载数据 library(tm)library(ggplot2)data.path<-'F ...

随机推荐

  1. 企业级账号更新app

    企业级账号 版本更新总结       参考:http://jingyan.baidu.com/article/a3aad71aa5fbfbb1fb0096b1.html 1.打包ipa,plist工具 ...

  2. 从浏览器的console获取angularjs的scope

    http://ionicframework.com/blog/angularjs-console/ 1: Access Scopes We can access any scope (even iso ...

  3. mysql去除重复查询的SQL语句基本思路

    SELECT R.* FROM trans_flow R, (SELECT order_no, MAX(status_time) AS status_time FROM trans_flow GROU ...

  4. ZOJ3560 Re:the Princess(高斯消元法)

    题目要读很久才能理解它的意思和笑点(如果你也看过那个笑话的话),读懂之后就会发现是一个高斯消元法的题目,对于我来说难点不在高斯消元,而在于字符串处理.先来说说题意吧: 总共有n个人,n个人都会有一段话 ...

  5. 在运行jar时自动加载指定的jar包

    初学Java的人经常遇到的一个问题是:如果一个程序依赖某个文件夹下的一堆jar包,那么启动它的时候就需要在java -cp参数后面一个一个的加上jar包的名称,很不方便. 比如主程序类叫Main,在目 ...

  6. 模拟+思维 HDOJ 5319 Painter

    题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ...

  7. spring PropertyPlaceholderConfigurer 找不到配置文件原因

    1:  spring 版本问题 参见: http://www.cnblogs.com/alex-blog/archive/2012/12/25/2832357.html 2: bean id 同名   ...

  8. iOS 应用内付费(IAP)开发步骤

    折腾好几天,原来是税务信息没有填写,哎...  国内就是好啊,没有这些麻烦的事情...  :) 等24小时,等税务的审核结果...     有结论了 才能测试内购.... 如果税务信息没有填写完毕,p ...

  9. angularJS之$watch、$digest和$apply方法

    最近项目上使用了比较多的angular JS,一直都对它感觉比较陌生,总觉得有点反直觉,这段时间,准备下定决心弄明白,这个框架到底是怎么一回事,以及它的工作原理,生命周期……一点一点的啃完它吧.首先, ...

  10. web.xml中servlet初始化参数的设置

    <context-param><param-name>param1</param-name><param-value>value1</param- ...