#一,自己写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. Codeforces Round #FF (Div. 2)

    又一场中国场,果然注定被虐的场... A,B:都很水,差不多模拟就好了: C题:CF难得的题意简洁, 我们可以预处理出从左到右递增的数列个数, 举个例子:1 3 2 4 5 7 L[I]       ...

  2. 如何在帝国cms后台菜单栏中添加删除链接?

    下午测试一个网上下载经过二次开发的帝国cms系统,还原完数据进入后台ytkah发现菜单栏多出了几个链接,有点不习惯,就想着怎么把它去掉.由于自己用的win7系统,搜索时没有像xp那样可以搜索包含某字符 ...

  3. hdu 1531(差分约束)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1531 差分约束的题之前也碰到过,刚好最近正在进行图论专题的训练,就拿来做一做. ①:对于差分不等式,a ...

  4. poj 3159(差分约束经典题)

    题目链接:http://poj.org/problem?id=3159思路:题目意思很简单,都与给定的条件dist[b]-dist[a]<=c,求dist[n]-dist[1]的最大值,显然这是 ...

  5. java 时间戳与日期字符串相互转换

    /** * 时间戳转换成日期格式字符串 * @param seconds 精确到秒的字符串 * @param formatStr * @return */ public static String t ...

  6. lintcode:交错正负数

    交错正负数 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组. 注意事项 不需要保持正整数或者负整数原来的顺序. 样例 给出数组[-1, -2, -3, 4, 5, 6],重新排序之后 ...

  7. SPRING IN ACTION 第4版笔记-第十一章Persisting data with object-relational mapping-001-使用Hibernate(@Inject、@EnableTransactionManagement、@Repository、PersistenceExceptionTranslationPostProcessor)

    一.结构 二.Repository层 1. package spittr.db; import java.util.List; import spittr.domain.Spitter; /** * ...

  8. UML元素分析

  9. intellij idea搭建ssh开发框架之绑定数据源

    原文:intellij idea搭建ssh开发框架之绑定数据源 在intellij idea中绑定数据源并生成hibernate实体对象.在IDE中的右边找到Database标签. 点击弹出窗口中的图 ...

  10. CentOS7安装配置FTP服务器

    假设我们有以下要求 路径 权限 备注 /ftp/open 公司所有人员包括来宾均可以访问 只读 /ftp/private 仅允许Alice.Jack.Tom三个人访问 Alice.Jack只允许下载, ...