#一,自己写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. remoting技术

    转: http://www.cnblogs.com/rickie/category/5082.html

  2. 关于JS APP

    多屏screen, JS如何路由,如何换页,导航.通过JS来实现. 当前页面的逻辑通过JS来实现.HTML DOM, Event, Widget. 核心在于function. JS 不仅仅是DOM, ...

  3. 强力重置ASP.NET membership加密后的密码![转]

    公司网站的用户管理采用的是ASP.NET内置的membership管理,在web.config文件中的密码格式配置是加密了的,passwordFormat="Hashed",这样在 ...

  4. ExtJs布局之tabPanel

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  5. 优化DB2缓冲页的大小

    零部件日结无法进行下去,建议配置C:\Program Files\SQLLIB目录下的db2cli.ini文件,加入此节:[DMSCNDB]CLIPkg=5 并重启DB2试试 另外,可以在命令行处理器 ...

  6. BZOJ 1296: [SCOI2009]粉刷匠 分组DP

    1296: [SCOI2009]粉刷匠 Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上 ...

  7. android listview 加载图片错乱(错位)

       写道 今天晚上一个朋友介绍我看了一篇文章,也是解决android中listview在加载图片错位的问题,看了之后,感觉写的很好,自己也遇到这个问题,但是又不知道从何下手,看到这篇文章后,我的问题 ...

  8. How a woman's glance can tell a man if she's interested

    How a woman's glance can tell a man if she's interested揭秘:女人是否喜欢你?看眼神就知道The female mind has always b ...

  9. iOS 开发--添加工程

    文/Bison(简书作者)原文链接:http://www.jianshu.com/p/dd71e15df5d0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 第一部分,配置项目 在此只 ...

  10. 289. Game of Life

    题目: According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a ce ...