天马漫步

2010年03月9日

力克(Nick Vujicic):我和世界不一样

类归于: life — 标签: — tangtang @ 12:53 下午

力克是一个没有手,没有脚的残疾人,英俊的他让我们见证了一个不一样的世界,不要悲伤,不要放弃,你也可以拥有无穷的快乐!

基于Apache Mahout/Taste构建社会化推荐引擎

类归于: Data-Mining — 标签:, , — tangtang @ 11:29 上午

基于Apache Mahout/Taste构建社会化推荐引擎

Web 2.0 的一个核心思想就是”群体智慧”,即基于大众行为,为每个用户提供个性化的推荐。这使得如何让用户能更快速更准确的获得所需要的信息,成为了 Web 应用成败的关键。Apache Mahout 是 ASF(Apache Software Foundation)的一个较新的开源项目,提供机器学习领域的一些经典算法的高效实现。本文主要讲述如何基于 Apache Mahout 来构建社会化推荐引擎,帮助 Web 应用开发者更高效的实现个性化推荐功能,从而提高最终用户满意度。

推荐引擎简介

推 荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户 的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息中提取的,或是基于用户所在的社 会或社团环境。

根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类:

  • 基于内容的推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容的推荐引擎就会给你推荐一些热门的历史方面的书籍。
  • 基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。
  • 基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。
  • 混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。

随 着互联网上数据和内容的不断增长,人们越来越重视推荐引擎在互联网应用中的作用。可想而知,由于互联网上的数据过多,用户很难找到自己想要的信息,通过提 供搜索功能来解决这个问题是远远不够的。推荐引擎可以通过分析用户的行为来预测用户的喜好,使用户能更容易找到他们潜在需要的信息。这里以电子商务应用中 的推荐引擎为例来说明推荐引擎在互联网应用中的重要性。

电子商务推荐系统 (E-Commence Recommendation System) 向客户提供商品信息和购买建议,模拟销售人员帮助客户完成购买过程。智能推荐系统的作用可以概括为:将电子商务网站的浏览者转变为购买者 ,提高电子商务网站的交叉销售能力,提高客户对电子商务网站的忠诚度。

电子商务推荐系统的界面表现形式有以下几种:

  • 浏览:客户提出对特定商品的查询要求,推荐引擎根据查询要求返回高质量的推荐;
  • 相似商品:推荐引擎根据客户购物篮中的商品和客户可能感兴趣的商品推荐与它们类似的商品;
  • Email:推荐系统通过电子邮件的方式通知客户可能感兴趣的商品信息;
  • 评论:推荐系统向客户提供其他客户对相应产品的评论信息。

回页首

Apache Mahout 简介

Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。经典算法包括聚类、分类、协同过 滤、进化编程等等,并且,在 Mahout 的最近版本中还加入了对 Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中。


回页首

Taste 简介

Taste 是 Apache Mahout 提供的一个协同过滤算法的高效实现,它是一个基于 Java 实现的可扩展的,高效的推荐引擎。Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。同时,Taste 不仅仅只适用于 Java 应用程序,它可以作为内部服务器的一个组件以 HTTP 和 Web Service 的形式向外界提供推荐的逻辑。Taste 的设计使它能满足企业对推荐引擎在性能、灵活性和可扩展性等方面的要求。

Taste 工作原理
图 1. Taste 的主要组件图
图 1. Taste 的主要组件图
Taste 由以下五个主要的组件组成:

  • DataModel:DataModel 是用户喜好信息的抽象接口,它的具体实现支持从任意类型的数据源抽取用户喜好信息。Taste 默认提供 JDBCDataModel 和 FileDataModel,分别支持从数据库和文件中读取用户的喜好信息。
  • UserSimilarity 和 ItemSimilarity:UserSimilarity 用于定义两个用户间的相似度,它是基于协同过滤的推荐引擎的核心部分,可以用来计算用户的”邻居”,这里我们将与当前用户口味相似的用户称为他的邻居。 ItemSimilarity类似的,计算内容之间的相似度。
  • UserNeighborhood:用于基于用户相似度的推荐方法中,推荐的内容是基于找到与当前用户喜好相似的”邻居用户”的方式产生的。UserNeighborhood 定义了确定邻居用户的方法,具体实现一般是基于 UserSimilarity 计算得到的。
  • Recommender:Recommender 是推荐引擎的抽象接口,Taste 中的核心组件。程序中,为它提供一个 DataModel,它可以计算出对不同用户的推荐内容。实际应用中,主要使用它的实现类 GenericUserBasedRecommender 或者 GenericItemBasedRecommender,分别实现基于用户相似度的推荐引擎或者基于内容的推荐引擎。

Taste 的安装与简单的 Demo 实现

安装 Taste 的软件需求:

  • 如果需要 build 源代码或者例子,需要 Apache Ant 1.5+ 或 Apache Maven 2.0.10+。
  • Taste 应用程序需要 Servlet 2.3+ 容器,例如 Jakarta Tomcat
  • Taste 中的 MySQLJDBCDataModel 实现需要 MySQL 4.x+ 数据库。

安装 Taste 并运行 Demo:

  1. 从 SVN 或是下载压缩包得到 Apache Mahout 的发布版本:
  2. 从 Grouplens 下载数据源:“1 Million MovieLens Dataset”
  3. 解 压数据源压缩包,将 movie.dat 和 ratings.dat 拷贝到 Mahout 安装目录下的 taste-web/src/ main/resources/org/apache/mahout/cf/taste/example/grouplens 目录下。
  4. 回到在 core 目录下,运行”mvn install”,将 Mahout core 安装在本地库中。
  5. 进入 taste-web, 拷贝 ../examples/target/grouplens.jar 到 taste-web/lib 目录
  6. 编辑 taste-web/recommender.properties,将 recommender.class 设置为 org.apache.mahout. cf.taste.example.grouplens.GroupLensRecommender。
  7. 在 Mahout 的安装目录下,运行”mvn package”。
  8. 运 行”mvn jetty:run-war”。这里需要将 Maven 的最大内存设置为 1024M,MAVEN_OPTS=-Xmx1024M。如果需要在 Tomcat 下运行,可以在执行”mvn package”后,将 taste-web/target 目录下生成的 war 包拷贝到 Tomcat 的 webapp 下,同时也需要将 Java 的最大内存设置为 1024M,JAVA_OPTS=-Xmx1024M,然后启动 Tomcat。
  9. 访问 “http://localhost:8080/[your_app]/RecommenderServlet?userID=1″,得到系统为编号为 1 的用户的推荐内容。参看图 2,Taste demo 运行结果界面,每一行第一项是推荐引擎预测的评分,第二项是电影的编号。
  10. 同时,Taste 还提供 Web 服务访问接口,通过以下 URL 访问:http://localhost:8080/[your_app]/RecommenderService.jwsWSDL 文件:http://localhost:8080/[your_app]/RecommenderService.jws?wsdl也可以通过简单的 HTTP 请求调用这个 Web 服务:http://localhost:8080/[your_app]/RecommenderService.jws?method=recommend&userID=1&howMany=10

图 2. Taste Demo 运行结果界面
图 2. Taste Demo 运行结果界面


回页首

使用 Taste 构建推荐引擎实例 - 电影推荐引擎

根据上面的步骤,我们可以得到一个简单的推荐引擎 demo 环境,下面介绍如何使用 Taste 方便地构建自定义的推荐引擎。

抽取 Taste 工具包

直接使用 Mahout 的项目环境进行编码,需要使用 Ant 或者 Maven 进行编译,整个过程比较复杂,这里我们将构建推荐引擎所需要的工具包从 Mahout 工程中抽取出来,从而方便的构建自定义的推荐引擎。

在 Eclipse 中创建 Web 应用的工程 MovieSite,将 demo 时生成的推荐引擎 Web 应用的 war 包解压缩,将 lib 下的 jar 文件拷贝到 MovieSite 的 lib 目录下。这样我们就可以方便的编写自己的推荐引擎。
图 3. MovieSite 工程中引用的 jar 文件
图 3. MovieSite 工程中引用的 jar 文件
数据建模

这里我们想要编写一个电影推荐引擎,第一步需要对数据进行建模,分析应用中涉及的主要实体以及实体间的关系,从而设计数据库存储,程序中的类,以及推荐引擎的 DataModel。
图 4 电影和用户信息数据模型
图 4 电影和用户信息数据模型
数据模型中存在以下实体:

  • Movie:表示电影,包含电影的基本信息:编号、名称、发布时间、类型等等。
  • User:表示用户,包含用户的基本信息:编号、姓名、邮件等等。
  • Movie Reference:表示某个用户对某个电影的喜好程度,包含用户编号、电影编号、用户的评分以及评分的时间。
  • Movie Similarity:表示两个电影的相似度(这里的相似度是双向的),包括两个电影编号、电影的相似度。两个电影的相似度可以通过电影的基本信息计算得到。

下面我们就基于这个数据模型设计数据库的存储以及推荐引擎的 DataModel。

  1. 1 .创建 MySQL 数据库存储电影和用户的信息,用户的喜好信息以及电影的相似度。清单 1. 创建数据库 SQL
     CREATE DATABASE movie;
     USE movie;
     CREATE TABLE movies (  // 保存电影相关的信息。
        id INTEGER NOT NULL AUTO_INCREMENT,
        name varchar(100) NOT NULL,
        published_year varchar(4) default NULL,
        type varchar(100) default NULL,
     --    ...more movie information...
        PRIMARY KEY (id)
     ); 
    
     CREATE TABLE users (  // 保存用户信息
        id INTEGER NOT NULL AUTO_INCREMENT,
        name varchar(50) NOT NULL,
        email varchar(100) default NULL,
     --    ...more user information...
        PRIMARY KEY (id)
     ); 
    
     CREATE TABLE movie_preferences (  // 保存用户对电影的评分,即喜好程度
        userID INTEGER NOT NULL,
        movieID INTEGER NOT NULL,
        preference INTEGER NOT NULL DEFAULT 0,
        timestamp INTEGER not null default 0,
        FOREIGN KEY (userID) REFERENCES users(id) ON DELETE CASCADE,
        FOREIGN KEY (movieID) REFERENCES movies(id) ON DELETE CASCADE
     ); 
    
     CREATE TABLE movie_similarity (   // 保存电影和电影的相似程度
        movieID1 INTEGER NOT NULL,
        movieID2 INTEGER NOT NULL,
        similarity DOUBLE NOT NULL DEFAULT 0,
        FOREIGN KEY (movieID1) REFERENCES movies(id) ON DELETE CASCADE,
        FOREIGN KEY (movieID2) REFERENCES movies(id) ON DELETE CASCADE
     ); 
    
     CREATE INDEX movie_preferences_index1 ON movie_preferences ( userID , movieID );
     CREATE INDEX movie_preferences_index2 ON movie_preferences ( userID );
     CREATE INDEX movie_preferences_index3 ON movie_preferences ( movieID );

    在实际应用中,我们需要将应用中的实例数据写入到数据库中。作为例子,这里将从 GroupLen 下载的数据源写入数据库。

  2. 设计实现推荐引擎的 DataModel。由于上面采用数据库存储用户的喜好信息,这里需要基于数据库的推荐引擎实现。这里扩展 MySQLJDBCDataModel 实现电影推荐引擎的 DataModel 实例。清单 2. Taste DataModel 的实现
    public class MovieDataModel extends MySQLJDBCDataModel {
    
        //保存用户对电影的评分的数据库表名
        public final static String PERFERENCETABLE = "movie_preferences";
        public final static String USERID_COLUMN = "userID";   //表中用户标识的列名
        public final static String ITEMID_COLUMN = "movieID";  //表中电影标识的列名
        public final static String PERFERENCE_COLUMN = "preference";  //表中评分的列名
    
        public MovieDataModel(String dataSourceName) throws TasteException {
            super(lookupDataSource(dataSourceName), PERFERENCETABLE, USERID_COLUMN,
                ITEMID_COLUMN, PERFERENCE_COLUMN);
        }
    
        public MovieDataModel() {
            //DBUtil.getDataSource() 将返回应用的数据源
            //此应用是J2EE应用,所以这里会采用JDNI的方式创建数据库链接。
            super(DBUtil.getDataSource(), PERFERENCETABLE, USERID_COLUMN,
                ITEMID_COLUMN, PERFERENCE_COLUMN);
        }
    }

推荐引擎实现

前 面介绍了数据建模和 DataModel 的实现,下面来详细介绍推荐引擎的实现。如前面介绍的,Taste 既实现了最基本的基于用户的和基于内容的推荐算法,同时也提供了扩展接口,使用户可以方便的定义和实现自己的推荐算法。下面详细介绍如何扩展 Taste 的推荐引擎接口,实现基于用户相似度的推荐引擎,基于内容相似度的推荐引擎,以及 Slope One 的推荐引擎。Slope One 是一种非常快速简单的基于项目的推荐方法,需要使用用户的评分信息。
清单 3. 基于用户相似度的推荐实现

public class UserBasedRecommender implements Recommender {

    private final Recommender recommender;

    public UserBasedRecommender() throws IOException, TasteException {
        this(new MovieDataModel());
    }

    public UserBasedRecommender(DataModel model) throws TasteException {

        UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(model);
        userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(model));

        UserNeighborhood neighborhood =
            new NearestNUserNeighborhood(3, userSimilarity, model);
        recommender = new CachingRecommender(
            new GenericUserBasedRecommender(model, neighborhood, userSimilarity));
    }

    //对外提供的推荐的接口,参数为用户标识和推荐项的个数
    public List<RecommendedItem> recommend(long userID, int howMany)
        throws TasteException {
        return recommender.recommend(userID, howMany);
    }

    public List<RecommendedItem> recommend(long userID, int howMany,
        Rescorer<Long> rescorer) throws TasteException {
        return recommender.recommend(userID, howMany, rescorer);
    }

    //以下方法都是实现Recommender的接口
    public float estimatePreference(long userID, long itemID) throws TasteException {
        return recommender.estimatePreference(userID, itemID);
    }

    public void setPreference(long userID, long itemID, float value)
        throws TasteException {
        recommender.setPreference(userID, itemID, value);
    }

    public void removePreference(long userID, long itemID) throws TasteException {
        recommender.removePreference(userID, itemID);
    }

    public DataModel getDataModel() {
        return recommender.getDataModel();
    }

    public void refresh(Collection<Refreshable> alreadyRefreshed) {
        recommender.refresh(alreadyRefreshed);
    }

    public String toString() {
        return "UserBasedRecommender[recommender:" + recommender + ']';
    }
}

从上面的代码示例清单 3 可以看出,实现一个推荐引擎需要实现 Recommender 接口,它一般是对于某种 Taste 提供的推荐引擎的扩展,这是对 GenericUserBasedRecommender 进行的扩展,其中最重要的方法就是实例化推荐引擎的构造方法,一般其中涉及以下步骤:

  • 基于 DataModel,计算用户的相似度,这里采用 PearsonCorrelation 算法。
  • 为用户相似度设置相似度推理方法,这里采用了 AveragingPreferenceInferrer。
  • 基于用户相似度计算用户的”邻居”,这里将与该用户最近距离为 3 的用户设置为该用户的”邻居”。
  • 使 用以上得到的用户相似度对象和邻居用户的计算方法对象创建一个 GenericUserBasedRecommender 的实例。一般情况下,这时都采用 CachingRecommender 为 RecommendationItem 进行缓存,从而提高访问速度。

清单 4. 基于内容相似度的推荐实现

public class ItemBasedRecommender implements Recommender {

    private final Recommender recommender;

    public ItemBasedRecommender() throws IOException, TasteException {
        this(new MovieDataModel());
    }

    public ItemBasedRecommender(DataModel dataModel) throws TasteException {

        Collection<GenericItemSimilarity.ItemItemSimilarity> correlations =
            MovieSimilarityTable.getAllMovieSimilarities();
        ItemSimilarity itemSimilarity = new GenericItemSimilarity(correlations);
        recommender = new CachingRecommender(new EmbededItemBasedRecommender(
            new GenericItemBasedRecommender(dataModel, itemSimilarity)));
    }

    public List<RecommendedItem> recommend(long userID, int howMany)
        throws TasteException {
        return recommender.recommend(userID, howMany);
    }

	.........

    //EmbededItemBasedRecommender类的定义
    private static final class EmbededItemBasedRecommender implements Recommender {

        //包含一个GenericItemBasedRecommender实例;
        private final GenericItemBasedRecommender recommender;

        private EmbededItemBasedRecommender(GenericItemBasedRecommender recommender) {
            this.recommender = recommender;
        }

        public List<RecommendedItem> recommend(long userID,  int howMany,
            Rescorer<Long> rescorer)
            throws TasteException {
            FastIDSet itemIDs = recommender.getDataModel().getItemIDsFromUser(userID);
            return recommender.mostSimilarItems(itemIDs.toArray(), howMany, null);
        }

    ........

}

从上面的代码示例清单 4 可以看出,与上一个实现类似它是对 GenericItemBasedRecommender 的扩展,它的构造方法涉及以下步骤:

  1. 为了提高推荐引擎的实时响应速度,这里需要对电影信息的预处理,将电影的相似度提前计算好存储在数据库中的 movie_similarity 表中,然后从数据库中读取所有的电影的相似度,用于创建 ItemItemSimilarity 的集合。
  2. 基于 ItemItemSimilarity 的集合生成一个内容相似度 ItemSimilarity。
  3. 创 建一个 EmbededItemBasedRecommender 实例,它是一个内部类,包含一个 GenericItemBasedRecommender 实例,它的 recommend 方法中,先从 DataModel 中得到该用户评分的电影列表,然后调用 GenericItemBasedRecommender 中的 mostSimilarItems 方法计算出最相似的电影推荐给用户。

清单 5. SlopeOne Recommeder 的实现

public final class MovieRecommender implements Recommender {

    private final Recommender recommender;

    public MovieRecommender() throws IOException, TasteException {
        this(new MovieDataModel());
    }

    public MovieRecommender(DataModel dataModel) throws TasteException {
        //创建一个SlopeOneRecommender的实例
        recommender = new CachingRecommender(new SlopeOneRecommender(dataModel));
    }

    //对外提供的推荐的接口,参数为用户标识和推荐项的个数
    public List<RecommendedItem> recommend(long userID, int howMany)
        throws TasteException {
        return recommender.recommend(userID, howMany);
    }

	........

}

Slope One 是一种非常快速简单的基于项目的推荐方法,它只需要使用用户的评分信息。具体的实现,只需要在我们的推荐引擎中包含一个 SlopeOneRecommender 的实例。

推荐引擎 API 设计与实现

完 成了推荐引擎的设计与实现,下面我们需要设计一些 REST API,向外暴露推荐功能。为了提高推荐引擎的处理效率,这里采用 Singleton 模式实现一个推荐引擎的单例 MovieRecommenderSingleton。在 Servlet 启动的时候初始化推荐引擎的单例,以后每次调用推荐方法。
清单 6. Servlet 的实现

public class MovieRecommenderServlet extends HttpServlet {

	private static final int NUM_TOP_PREFERENCES = 20;
    private static final int DEFAULT_HOW_MANY = 20;

    private Recommender recommender;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

		//从web.xml中读取需要创建的推荐引擎类名
        /*
         * <servlet>
         * 	<servlet-name>movie-recommender</servlet-name>
         * 	<display-name>Movie Recommender</display-name>
         * 	<description>Movie recommender servlet</description>
         * 	<servlet-class>
         *      com.ibm.taste.example.movie.servlet.MovieRecommenderServlet
         *  </servlet-class>
         * 	<init-param>
         * 		<param-name>recommender-class</param-name>
         * 		<param-value>
         *          com.ibm.taste.example.movie.recommender.UserBasedRecommender
         *      </param-value>
         * 	</init-param>
         * 	<load-on-startup>1</load-on-startup>
         * </servlet>
         */
        String recommenderClassName = config.getInitParameter("recommender-class");
        if (recommenderClassName == null) {
            throw new ServletException(
                "Servlet init-param \"recommender-class\" is not defined");
        }

		try {
            MovieRecommenderSingleton.initializeIfNeeded(recommenderClassName);
        } catch (TasteException te) {
            throw new ServletException(te);
        }
        recommender = MovieRecommenderSingleton.getInstance().getRecommender();
    }

    @Override
    public void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException {
		//Parameters.USER_ID = "userID"
        String userIDString = request.getParameter(Parameters.USER_ID);
        if (userIDString == null) {
            throw new ServletException("userID was not specified");
        }
        long userID = Long.parseLong(userIDString);
        String howManyString = request.getParameter(Parameters.COUNT);
        //Parameters.COUNT = "count"
        int howMany = howManyString == null ? DEFAULT_HOW_MANY :
            Integer.parseInt(howManyString);
        String format = request.getParameter(Parameters.FORMAT);
        //Parameters.FORMAT = "format"
        if (format == null) {
            format = "json";
        }

        try {
            //为指定用户计算推荐的电影
            List<RecommendedItem> items = recommender.recommend(userID, howMany);
            //加载电影的相关信息,RecommendMovieList是保存了一组推荐电影的相关信息和
            //引擎计算得到的他们的ranking
            RecommendMovieList movieList = new RecommendMovieList(items);
            if ("text".equals(format)) {
                writePlainText(response, movieList);
            } else if ("json".equals(format)) {
                writeJSON(response, movieList);
            } else {
                throw new ServletException("Bad format parameter: " + format);
            }
        } catch (TasteException te) {
            throw new ServletException(te);
        } catch (IOException ioe) {
            throw new ServletException(ioe);
        }

    }
    //details please refer to the src code
}

以上完成了电影推荐引擎服务器端的编程,下面我们使用 FireFox 的插件 Poster 测试一下 HTTP 请求,查看推荐引擎的返回结果。对任意一个用户,推荐引擎应该基于一定的规则计算得到一组电影以及预计的评分,为了有更好的用户体验,引擎在拿到推荐电影 序号的列表后,从电影信息数据库中查询得到电影的相关信息,包括电影的名称,发表时间以及类型等信息。这里我们采用 JSON 作为推荐引擎的响应格式。
图 4. 用 Poster 测试 Servlet 的结果(查看大图
图 4. 用 Poster 测试 Servlet 的结果
用户界面展示

实现一个推荐引擎的最后一步就是编写客户端代码,为电影推荐引擎提供一个友好的用户界面。下面展示一下我们为电影推荐引擎写的一个简单的用户界面:右边红色框中的是该用户已经打分的电影列表,左边蓝色框中是推荐引擎为用户推荐的电影列表。

首先,展示一下基于用户的推荐引擎的推荐结果,推荐引擎会根据用户已打分的电影找到用户的”邻居”,将”邻居”们比较喜欢的电影推荐给当前用户。
图 5. 基于用户的推荐结果(查看大图
图 5. 基于用户的推荐结果
其次,图 6 展示了基于内容的推荐引擎的推荐结果,推荐引擎会根据用户已打分的电影找到相似的电影,推荐给当前用户。
图 6. 基于内容的推荐结果(查看大图
图 6. 基于内容的推荐结果
最后,展示 SlopeOne 推荐引擎的推荐结果,这种推荐引擎计算速度较快,效果很好,是一种非常快速简单的基于项目的推荐方法。
图 7. SlopeOne 实现的推荐结果(查看大图
图 7. SlopeOne 实现的推荐结果


回页首

总结

目 前几乎所有大型的电子商务系统,都不同程度地使用了各种形式的推荐引擎。推荐技术的使用,不仅大大的提高了用户购物的体验,增加了用户的粘着度,而且电子 商务公司也由于推荐系统的应用而大大的提高了交叉销售的可能,从而大大的提高了营业额。今天,你有自己的商品推荐系统么?

借鉴于 电子商务的成功经验,我们可以把推荐技术应用到其他的领域。像我们在文章中所演示的那样,你可以创建一个电影的推荐引擎。如果你是一个 blogger,那么你可以创建一个博客的推荐引擎,如果你是一个新闻提供商,你可以使用推荐技术为不同的用户推荐它可能关心的新闻,等等。

今天,你推荐了么?


回页首

下载

描述 名字 大小 下载方法
本文示例代码 src.zip 14 MB HTTP
关于下载方法的信息

参考资料

  • Apache Mahout 简介” (Grant Ingersoll,developerWorks,2009 年 10 月):Mahout 的创始者 Grant Ingersoll 介绍了机器学习的基本概念,并演示了如何使用 Mahout 来实现文档集群、提出建议和组织内容。
  • Apache Mahout:Apache Mahout 项目的主页,搜索关于 Mahout 的所有内容。
  • Taste Documentation:Taste 的介绍文档,阅读 Taste 文档。
  • GroupLens:从 GroupLens 项目获取真实的电影评分数据。
  • 机器学习:机器学习的 Wikipedia 页面,可帮助您了解关于机器学习的更多信息。
  • developerWorks Java 技术专区:数百篇关于 Java 编程各个方面的文章。

文档来源

http://www.ibm.com/developerworks/cn/java/j-lo-mahout/

2010年02月24日

ClickHeat安装使用手册

类归于: Data-Mining — 标签:, — tangtang @ 6:11 下午

ClickHeat安装使用手册

ClickHeat是一套优秀的开源软件,它实现了在HTML网页上生成可视化的点击热图,即将用户的鼠标点击转换为可视化的冷热图形。它通过Javascript脚本进行跟踪记录,采用PHP语言来记录日志,采用General Dynamics图形库来生成热图。

ClickHeat的官方网站是:http://www.labsmedia.com/clickheat/index.html
ClickHeat的开源下载网址是:http://sourceforge.net/projects/clickheat/
GD库的网址:http://www.boutell.com/gd/

从sourceforge下载该软件包,目前版本是clickheat-1.9-revB。解压,上传到PHP环境中。如:http://tool.tangtang.org/clickheat/

打开界面,系统开始初步检查:“写入配置失败”,“GD库”允许,进入下一步配置,因为是多国语言版,你可以选择你需要的语言界面。

配置

显示配置
显示热图,取消选项则显示点击图    (默认: on)
开始时显示昨天的数据,取消选项则显示当天数据    (默认: off)
透明程度 (0 => 100)    (默认: 80)
自动删除 N 天前的数据 (0 = 不删除,不推荐)    (默认: 40)
周开始    周一 周日
隐藏 <iframe> 框架    (默认: on)
隐藏 <Flash> 元素    (默认: on)
热图配置
日志文件目录
缓存文件目录
内存限制(php.ini默认值: 128MB, 大小限制: 从 1 到 256MB, 但请小心使用较大的内存设置)
合并点击区域范围(将提升热图的显示)    (默认: 5)
热图点大小(单位:像素)    (默认: 19)
当你看到热图上出现红色区域,请选择此项    (默认: off)
安全配置
域名列表 (使用,分隔) 允许记录的域名列表
分组列表 (使用,分隔) 允许记录的分组名称列表
每天单个分组允许的最大日志文件大小,单位KB(1000 个点击记录大约 25KB, 0 = 不限制)    (默认: 0)
登陆配置
管理员名字
管理员密码 (请输入两遍)
访客名字 (不需要访客请留空)
访客密码 (请输入两遍)

只需要输入域名列表:www.tangtang.org,www.caiziyuan.org
输入分组列表:tangtangorg_bbs_index,caiziyuanorg_bbs_index
设置好用户名、密码,点“检查配置”,全部显示OK。保存后,重新登陆,进入页面。

接下来,是设置Javascript:网址:www.caiziyuan.org,分组名:caiziyuanorg_bbs_index,将生成的js代码拷贝到你的网站中,比如在discuz系统中,用广告系统嵌入到首页的HTML代码中,之后就是等待数据生成效果图了。

2010年02月23日

点击热图分析系统

类归于: Data-Mining — 标签:, , — tangtang @ 3:54 下午

1、clickheat
特点:开源的点击热图,提供红外线图、点叉图,配置灵活,可以对任意页面、任意组进行分析。
官方网站:http://www.labsmedia.com/clickheat/index.html
开源下载站点:http://sourceforge.net/projects/clickheat/
2、Google Analytics
特点:根据链接进行分析得到的点击图,包含数量、百分比,直接在链接上显示直方图,只提供首先的分析。
官方网站:http://www.google.com/intl/zh-CN_ALL/analytics/
3、维度统计
特点:国产,没有试用过。
官方网站:http://www.vdoing.com/index.html
4、clicklab
特点:国产,安装后无法工作,记录于此,以观后效。
官方网站:http://www.clicklab.cn/

另外,还有一种方式不是通过鼠标点击来形成可视化效果图的,而是通过眼动仪器记录,形成可视化效果图,来表示用户的关注区域。http://en.wikipedia.org/wiki/Eye_tracking

2010年02月21日

Pentaho安装配置手册

类归于: Data-Mining — 标签: — tangtang @ 10:54 上午

最近都在做数据挖掘,有了数据,当然需要一个得心应手的工具啦。阿里巴巴的KJ推荐Pentaho,那就让我们一步步走进Pentaho的世界吧。

Pentaho以前是一个开源软件,但最近的版本貌似开始收费了,不管收费与否,至少之前是开源的,先拿来学习一下。

Pentaho的官方网站:http://www.pentaho.com/

Pentaho的开源项目:http://sourceforge.net/projects/pentaho/

去下一个最新版本:http://sourceforge.net/projects/pentaho/files/Business%20Intelligence%20Server/3.5.0-stable/biserver-ce-3.5.0.stable.zip/download

解压到E:\tools下,启动E:\tools\biserver-ce-3.5.0.stable\administration-console下的start-pac.bat,当然,前提是你已经安装了jdk,需要设置环境变量JAVA_HOME,直到echo %JAVA_HOME%成功为止。

启动后提示:

DEBUG: Using JAVA_HOME
DEBUG: _PENTAHO_JAVA_HOME=E:\tools\jdk1.6.0_13
DEBUG: _PENTAHO_JAVA=E:\tools\jdk1.6.0_13\bin\java.exe
2010-02-21 11:01:31.620::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2010-2-21 11:01:31 org.pentaho.pac.server.JettyServer startServer
信息: Console is starting
2010-02-21 11:01:31.745::INFO:  jetty-6.1.2
2010-02-21 11:01:31.792::INFO:  Started SocketConnector @ 0.0.0.0:8099
2010-2-21 11:01:31 org.pentaho.pac.server.JettyServer startServer
信息: Console is now started. It can be accessed using http://tangtang:8099 or http://172.16.101.2:8099

那么,我们就根据提示进入:http://tangtang:8099,提示用户名密码:http://localhost:8099 请求用户名和密码。信息为: “Pentaho”,输入admin/hello,日志里显示:

2010-02-21 11:17:43.835::WARN:  javax.security.auth.login.LoginException: 登录失败:忽略所有模块
2010-02-21 11:17:43.835::WARN:  AUTH FAILURE: user admin

看来一定是哪里需要设置用户名、密码了。。

E:\tools\biserver-ce-3.5.0.stable\administration-console>java -cp lib/jetty-6.1.2.jar;lib/jetty-util-6.1.9.jar org.mortbay.jetty.security.Password admin hello
hello
OBF:1vnc1ugo1vun1uh21vnq
MD5:5d41402abc4b2a76b9719d911017c592
CRYPT:adux5x.JUHzRk

重新启动,进入8099页面,提示信息:

信息: Console is starting
2010-02-21 11:01:31.745::INFO:  jetty-6.1.2
2010-02-21 11:01:31.792::INFO:  Started SocketConnector @ 0.0.0.0:8099
2010-2-21 11:01:31 org.pentaho.pac.server.JettyServer startServer
信息: Console is now started. It can be accessed using http://tangtang:8099 or http://172.16.101.2:8099
2010-2-21 11:01:45 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
信息: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect

成功出现界面。OK,良好的开端就是成功的一半。

又出现错误提示:

Unable to refresh security information: The call failed on the server; see server log for details

Unable to refresh database connection list: PacService.ERROR_0023 - Failed to get a Data Source: Cannot open connection

Connection refused: connect

那么,我们继续吧。。。

2010年02月20日

19楼《都市房坚强》

类归于: life — tangtang @ 5:08 下午

19楼春晚新作:《都市房坚强》;主演:罩兄;演唱:阿杜。

2010年01月28日

十九楼搬家了

类归于: life — 标签: — tangtang @ 9:00 下午

十九楼从2006年10月10日创立公司,经历了三年三个月的发展,从杭报时代,进入东软时代。新家很大,办公桌是蜂窝状,中间放了很多花,只是现在装修甲醛味还太重,很多人都带着口罩,呵呵。。

2010年01月26日

将Above&Beyond日历导入Google Calendar

类归于: tool — 标签:, , — tangtang @ 1:43 下午

以前一直使用Above & Beyond来用过时间管理,最近觉得采用此方式,可能会受到电脑损坏,或者其他原因,以前的任务经历可能会丢失。于是,想把AB的任务时间记录导入到Google日历(简称GC)中,于是开始了此次迁移历程。
A&B可以通过”Project”-”Invoice”把任务记录导出来,如ab.invoice.pro,格式如下:

Project    invoice    for    all    2007-1-1~2010-1-20
2007-1-8    9:39    9:50    0.2    安排工作
2007-1-8    9:50    11:10    1.3    与同事交流:AB2003时间管理软件的使用

Google日历提供多种格式进行导入,进入”设置”-”日历”-”导入日历”,显示”选择包含您的活动的文件。Google 日历可以导入 iCal 或 CSV (MS Outlook) 格式的活动信息。”,那么符合Google的日历格式是什么样的呢?我们该如何进行导入呢?

首先,导出Google日历,看看默认格式是什么样子的。结果发现,格式非常复杂,放弃。

那么,既然支持Ms Outlook的csv格式,那么,就从csv格式入手。

先找同事电脑上的一个outlook,添加一个任务,并标记为私有的,导出为csv格式。格式如下:

Subject,Start Date,Start Time,End Date,End Time,All day event,Reminder on/off,Reminder Date,Reminder Time,Meeting Organizer,Required Attendees,Optional Attendees,Meeting Resources,Billing Information,Categories,Description,Location,Mileage,Priority,Private,Sensitivity,Show time as

看来,只要将AB的格式按照outlook的格式补充内容即可。

用excel导入AB的任务文件ab.invoice.pro,消除标题中的空格,成为标准的四列。

excel里面新建一个sheet,把outlook的头信息作为第一行,对应关系如下:

AB的任务描述->GC的Subject
AB的日期->GC的Start Date
AB的日期->GC的End Date
AB的开始时间->GC的Start Time
AB的结束时间->GC的End Time
如果想要GC的任务是Private,那么在设置Private列,设置”True”

保存这个sheet为gc.csv。因为GC的日期不是yyyy-mm-dd格式,而是mm/dd/yyyy格式,那么用UltraEdit打开gc.csv,用正则表达式替换,表达式为:^(200[789]^)-^([0-9]+^)-^([0-9]+^),替换为^2/^3/^1,可以替换2007-2009年的时间,2010年的表达式是^(2010^)-^([0-9]+^)-^([0-9]+^),^(*^)这样一个表达式,是用来标记正则表达式的位置的。在EditPlus中,正则表达式可能是(200[789])-([0-9]+)-([0-9]+),没有EditPlus,未曾验证:)

如果gc.csv是中文,需要用UTF-8编码保存。

经过这样一系列变换,得到最终的文件格式如下:

Subject,Start Date,Start Time,End Date,End Time,All day event,Reminder on/off,Reminder Date,Reminder Time,Meeting Organizer,Required Attendees,Optional Attendees,Meeting Resources,Billing Information,Categories,Description,Location,Mileage,Priority,Private,Sensitivity,Show time as
安排工作,1/8/2007,9:39,1/8/2007,9:50,,,,,,,,,,,,,,,True,,
与同事交流:AB2003时间管理软件的使用,1/8/2007,9:50,1/8/2007,11:10,,,,,,,,,,,,,,,True,,

最后,你最好选择包含header的几条记录可以做一下导入测试。

在Google Calendar里面,导入gc.csv,大功告成。

2010年01月15日

2009年度十大发明

类归于: technology — 标签: — tangtang @ 3:04 下午

“9·11”发生后,凯文·斯通(KevinStone)一直追看电视直播,看着那些悲惨的画面,一个念头萦绕在他脑际,挥之不去:为何困在世贸中心里的人无法安然返回地面?“我告诉自己,这太荒唐了,”斯通回忆说。他是圣弗朗西斯科一名整形医生,也是成果累累的发明狂人。“应该有种更好的方法,帮助人们在灾难时刻成功逃离摩天大楼。”

斯通发现,已有的高楼逃生设备不是有缺陷,就是不实用,于是他受渔线轮启发,设计了一种简单的新装置,依靠足够坚固的长绳,将人们从高楼平稳送至地面。使用者只需打开一个抽屉大小的盒子,将一条杜邦凯夫拉尔(KEVLAR)纤维制成的绳索钩在某个安全牢靠的物体或连接点上,然后将类似外衣的安全吊带套在身上,打开窗即可一溜而下,距地最高可达100层楼。使用者无须接受专门培训,完成全部准备动作不用一分钟。

斯通的发明亮点是一套离心式制动系统,可自动控制下降的速度和频率。逃生轮的绳索自一个线轴内伸出来,然后缠在一个与制动装置相连的轴上。随着线轴转动,一组制动块会对制动盒内缘施加压力,平稳、缓慢地将使用者放下。如果这套自动制动系统失灵,逃生轮上还配有手动的备用制动杆。从100层高的大楼下到地面,耗时不到四分钟,平均一秒钟下一层。

2007年,斯通试用了样品;随后专门制造攀登绳索的Skala公司在加州某消防局对它进行了全方位测试。消防安全顾问斯科特·杜格拉斯说,与消防员们过去使用的高层救援绳索相比,这套装置改进颇多,“它自动化程度高多了,使用起来也更加容易和直接。”

所有测试完成后,斯通准备将逃生轮推向市场,预计商业化版本会在明年面世,售价约为1500美元。他打算实现大规模生产后尽量降低产品价格,这样大楼业主就可以大批采购,将之作为租客们逃生的标准装备。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061827428111.jpg[/img]

[color=#a0aaac]————————————————————————————————–[/color]

打开YouYube上关于Ripsaw的热门链接,你可以看到这辆无人驾驶的坦克以每小时60英里的速度在泥泞的野地里披荆斩棘,从50英尺的高处跃下,将一排排的白桦树碾倒。

就像他们的创造物一样,Ripsaw的发明者、34岁的双胞胎兄弟吉奥夫·霍维和迈克·霍维一看就不是乖乖仔。7岁时他们就合建了一栋小木屋,10年后又把一辆校巴改造成移动舞台;2000年他们出现了分歧:吉奥夫想造一辆喷射式涡轮增压越野卡车,而迈克的目标是制造全球最快的履带车。“那个周末,迈克把我叫到他的车库,”吉奥夫说:“他已经为Ripsaw弄好了悬架,我只好接着干下去了。”

他们咨询了很多工程师,每个人都说他们不可能超越M1AAbrams,它号称“全球最强大的坦克”,时速42英里。普通坦克为了保护乘员,车架以厚厚的装甲钢制成,而Ripsaw的设计目标是在崎岖难行的地带执行无人任务,主要追求速度,因此兄弟俩开始考虑如何减重。他们用焊接钢管做了车架,就像Nascar(美国全国汽车比赛协会)的赛车一样,这使得车身强度增加了50%,自重减少了50%。

但是,如果你想彻底改造坦克,很难找到现成的配件,轻得能以每小时60英里的速度旋转、同时又坚固得不会飞掉的轮胎则根本不存在。于是豪威兄弟自己打造了钢制防滑系统,并重新设计了将防滑装置连接到履带上的整个机械装置。这种防滑系统仅重两磅左右,比同级坦克类似装置轻了90%。减重成功,再配上650匹的V8发动机,Ripsaw每磅动力输出约为M1AAbrams的9倍。

在做好日常工作的同时–迈克是金融顾问,吉奥夫是一家工厂的小头头———这两位自学成才的工程师还把Ripsaw样车从缅因州的工场拖到华盛顿,参加了2005年华盛顿汽车展,吸引了军方无人地面车(UGV)开发人员的注意,并获得缅因州参议员苏珊·科林斯———帮他们从国防部争得了125万美元的资助。

2006年,兄弟俩成立了霍维和霍维技术公司,致力于制造不同版本的Ripsaw,包括一种差速驱动车。他们将该作品交给美国陆军武器研究和开发中心,后者为它配备了M240遥控机关枪,然后进行长达数月的紧张测试。ARDEC项目主管巴凡约·辛格说,Ripsaw与其他UGV的最大区别就是速度。其他UGV最高时速只有20英里左右,Ripsaw却能跟上悍马。

在公司项目经理威尔·迈克马斯特的遥控下,一辆Ripsaw径直翻过一道三英尺高的水泥墙。霍维兄弟认为,在与同类竞争军用合同时,价值76万美元的Ripsaw极具优势。“其他UGV尺寸都很小,并使用人工智能技术避开障碍,”迈克说:“Ripsaw无须躲避,它直接从上面碾过。”
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061828209170.jpg[/img]
[color=#a0aaac]————————————————————————————————–[/color]

两年前,麻省理工学院最优秀的一群学生进行宿舍“卧谈”时,有人建议设计一个节能减震器。他们不仅说了,还真的做了,结果就是GenShock。这套系统利用汽车颠簸时的上下运动产生电力,帮助减少汽车交流发电机的工作量,最终达到省油目的。

GenShock其实是一个简单的液压系统,减震器的活塞将液体泵入,驱动液压马达和一个微型电动发电机。研究小组做出的首个样品利用四个减震器可以产生总计800瓦特的持续电力,若在坎坷不平的野地里行进,则最高可产生5千瓦的电力,约为普通汽车交流发电机所产生电量的7倍。GenShock下一代版本发电能力会翻倍,将商用卡车在铺装路面上的燃油公里数提高2%至5%,军车提高6%(军车披挂整齐时,油耗惊人,每加仑只能跑4到8英里),而混合动力车可将GenShock发的电储存起来,最高可节能10%。

对于笨重的商用卡车来说,这套系统相当超值。“一年内省下的油钱即可值回票价,”安维德哈尼说。尽管沥青路面产生的震动相对较少,有规率的高频振动仍可产生可观的电力。锦上添花的是,如果车子配有检测路况、调整减震水平的电脑感应系统,GenShock可让它有更好的表现。

麻省理工的知识产权部门对这项专利颇感兴趣,但研发小组2007年成立了自己的LevantPower公司。一位老师将他们的发明介绍给了悍马制造商AMGeneral公司总裁保罗·J·科恩,这位退休四星上将给他们寄来一辆崭新的悍马H1,用作实验。不久,双方签订了商业合同,估计GenShock将很快出现在美军的悍马车队上。

现在,小组成员在南波士顿租来的仓库和简陋办公室之间奔波,在车上安装GenShock和数据采集装置。在500英里的真实路测中,他们用定制的小型部件取代成品,以产生更多电力,并达到军方的严苛标准,比如终生正常运行、浸水时也能高效工作、限制电噪(以免影响与其他设备的联系),等等。

美国海军研究办公室、陆军战车研究开发工程中心和Nxxistar、MackTrucks等卡车制造商都对GenShock很感兴趣,只要它们有一个下了订单,这些已经毕业的年轻发明家就无须投简历求职了,GenShock就是他们的工作。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061828513600.jpg[/img]
[color=#a0aaac]————————————————————————————————[/color]

我们说话时涉及到三个最基本的步骤:肺部输送空气,声带震动,张嘴说话。Audeo意在帮助那些因为运动神经元疾病、创伤性脑损伤或其他问题出现言语障碍的人,他们大脑和声带完好,但肺部和嘴巴无法动作。

Audeo是这样工作的:三个药片大小的电极贴在喉部,捕捉大脑和声带之间发出的信号。电极内一个处理器可以过滤或者放大这些信号,然后将它们传输至附带的电脑上,电脑软件将这些信号解码,转换成单词,通过扬声器读出来。使用者通过声带运动静静“说话”,以足够的神经活动触发这一系列过程。

早在伊利诺斯大学读书时,卡拉汉就开始研制Audeo。他努力学习信号处理和神经学知识,整整花了四年功夫,才确定以何种方式过滤来自环境和身体中的不必要电噪(比如心跳),并只捕捉语言合成所需要的信号。

美国宇航局的艾姆斯研究中心也在研发类似装置,以控制漫游器,帮助宇航员在相距甚远或很嘈杂的情况下交流。然而,他们使用的是模式识别技术,只能辨出程序预设的词语。Audeo却允许使用所有考试版 版音素,用户想说什么就说什么,没有限制。

当然,这种技术仍有改进空间。现在使用Audeo每分钟最多只能说30个单词,大概是正常说话速度的五分之一。而且,要学会用音素“说话”还需要数日练习。但熟练掌握之后,Audeo可以达到非常优雅的效果,戴上它后,用户可以自如地打电话。卡拉汉成立的Am-bient公司正在开发一种手机界面,希望能让Audeo完全摆脱电脑,并降低售价,“我们希望它能像蓝牙耳机一样价廉物美。”
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061829113100.jpg[/img]

[color=#a0aaac]————————————————————————————————-[/color]

迈克尔·卡拉汉17岁时,不小心把头磕在滑板上,丧失了短时记忆。“神经通路全出毛病了,”他说。几周后他恢复正常,但事故令他陷入深思:如何帮助那些永久失去了部分日常行为能力的人?五年后,他拿出了Audeo,这个小小的装置可以探测并捕捉到大脑和声带之间交换的电子信号,并把它转换**们听得懂的语言。

戴上由迷你投影机、摄像头和笔记本电脑组合而成的“第六感”(SixthSense),普拉纳夫·米斯特仅做一个手势,就能拍摄照片;他将手机键盘投影到掌心,点着这些虚拟号码,就能拨出电话;他指指一本书,SixthSense就会到在线书店上把它的评论和报价表调出来,投影到书的封面上。看着麻省理工研究生米斯特展示这套设备,就像在欣赏魔术表演。但他和顾问、麻省理工媒体实验室的数字交互专家帕蒂·梅恩斯希望SixthSense能召唤来更多奇迹,让人们以无缝方式操作智能数字设备,提供科幻作品中想像的交互体验。

去年10月,与人讨论科幻电影《交互报告》时,梅恩斯有了创造交互界面的想法。她喜欢电影中用手势控制数字内容的点子,但希望设备更便宜,能为大众接受,并随时随地都能投射内容,实现交互。昵称“僵尸”的米斯特听完她的构想,三周之内就做出了样品。

尽管这套设备后来改进很大,但基本思路没变:一个便携式投影机和摄像头吊在米斯特胸前,两者都与他背着的手提电脑相连,他的拇指和食指上缠着四种不同颜色的记号或胶带。当系统接通,摄像头就开始捕捉影像,传送回电脑,后者的视觉运算模块随即开始工作。这套模块是设计精髓,它会过滤背景影像,识别哪种颜色的记号往哪个方向移动,即时跟踪各种手势,最终启动各种功能。比如米斯特想知道时间,就用食指在腕部画个圈,电脑接收到这个手势后,就会指令投影仪把一块表的影像投射到他的手腕上。

今年夏天,米斯特将与韩国三星公司工程师合作,将整个系统缩小,装到该公司生产的一款内置投影仪的智能手机上。随着产品的改进,最后连手指上的记号和胶带也可以不要,设备只需追踪手指活动,你走到哪里都可以进行交互体验。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061830534400.jpg[/img]

[color=#a0aaac]————————————————————————————————[/color]

1997年秋摔断脖子后,以色列工程师阿米特·高弗知道他的余生将在轮椅上度过。他很快开始研究ReWalk,一种可以帮助截瘫患者站立、慢走、甚至爬楼的外骨骼结构。

现在56岁的高弗知道,他的设计不仅要安全,还要节能,能持续使用一天,“我不想让人们带上一卡车电池出门。”为此他选择了一个自己永远没有机会使用的设计———他是从胸部以下瘫痪,但是如果使用者可以借助拐杖行走,那将节省能源、简化平衡问题,不用纯粹依靠设备把人竖起来。

高弗做出的样品重44磅,只消几分钟就能“穿”上,它有几种模式,如行走、坐下和上下楼梯,用腕部一个控制器进行操纵。例如,在行走模式下,当用户伸出拐杖、身体前倾时,置于ReWalk肩带上的传感器就会记录下这个动作,背包中的电脑将解析相关数据,指导臀部和一条腿膝部上的电动马达发动,带动这条腿向前(其他外骨骼类产品是从用户的实际腿部动作或其肌肉信号中获得提示,不适合瘫痪者使用),然后是另一根拐杖,另一次前倾,带动另一条腿前迈。当用户站直,设备就暂停运行,不再带用户往前走。

就像拐杖一样,这套设备很多配件(包括电动机和电池组)都是成品,无须定制。高弗说,ReWalk与同类产品不同之处在于其控制算法和编码。例如,他和同伴们发现在某些情况下,传感器可能会被甩脱,于是他们写了软件,记住这些差异并进行修正。软件也要过滤来自地面的震动,只在需要时启动,以免电池过早耗完;用户被障碍物绊到时,它还得飞快识别,及时复原设置,以免用户倒下,等等。

高弗说,下一代ReWalk重量会降到30磅。几位患者已经测试了样品,包括41岁的拉迪·卡约夫,他说病友们都很满意,“有了它,我可以面对面与人交谈,而非仰视他人。”
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061831121710.jpg[/img]

[color=#a0aaac]————————————————————————————————–[/color]

1998年,阿米尔·拜尔森(AmirBelson)拿到斯坦福大学奖学金,从以色列飞到美国修读儿科,身边带了一份清单,上面列了64个医学发明点子。其中很多是他在以色列空军当外科医生时想出来的,还有一些是他在一个新生儿重症看护中心工作时总结出来的。其中之一就是发明更好的静脉导管,不会伤害血管和肌肉。2005年,他做出了第一个样品。

过去30年来,用于把药物和液体滴入病人身体的静脉导管设计一直没有多大变化。拜尔森发现,40%的医务人员第一次进行静脉注射时都会遭遇失败。将针刺入皮肤,盲目地向前推进,常会令静脉阻塞,影响长达数周。病人淤伤,医生精疲力竭,医院每周还得耗费数千美元支付多余的针头和劳动。人们曾试图将超声技术或红外线应用于静脉导管,但两者都十分昂贵,需要专门培训。

相形之下,拜尔森发明的VascularPathways十分实用。不管采用什么针头,使用VascularPathways的医务人员只要一看到有血通过针管回流,就知道已经找到静脉,然后就可以推动一个滑杆,将一条导引线从针内安全推出。在导管顺着导引线接进来之前,导引线卷成一个圆圆的花形,以防导管尖端伤到静脉壁。最后,针和导引线抽走,留下导管就位。“它将带来巨大变化,再也不必反复寻找静脉,”华盛顿门诊外科中心医务主任杰夫·斯图亚特说。

拜尔森在兔子耳朵细小的静脉上做了实验,他试扎了100下,只有一次失败。获得美国食品及药物管理局的批准后,四月份拜尔森开始了为期两月的病人实验。如果成功,他打算与澳大利亚TelessoTechnologies公司合作,以与现有导管相仿的价格出售VascularPathways。
[img]http://postimg1.mop.com/201001/06/71/3872171/20100106183142850.jpg[/img]

[color=#a0aaac]————————————————————————————————–[/color]

本·霍宾斯没有动手清洁他家附近的湖水,但他发明的“铁甲”(IronClads)鱼饵却切切实实地做到了这一点。这位威斯康辛发明者的创意解决了一个鲜为人知但十分严肃的环境问题:柔软而便宜的软性塑料鱼饵很受钓鱼爱好者欢迎,但其最终归宿几乎都在水底,因为人们将钓线抛出或者鱼儿咬钩时,它们非常容易脱落。一项调查表明,光是在美国水下,每年就新增2500万磅鱼饵。

2006年,酷爱钓鱼的霍宾斯决定亲自打造一种更坚固的饵料,用于冰钓。“我最讨厌在零下几摄氏度的气温里换鱼饵,”他说。作为一名前生物科技战略家,他想到植皮手术中一种常用方法也适宜于加固鱼饵:用一种具扩张性的网膜来保证新移植的皮肤完好地保持在固定的位置。最后他发明了“铁甲”,用聚酯管制成的骨架提升塑料强度,就好像加入钢筋可以令水泥墙更坚固一样。这种鱼饵牢牢地挂在钩子上,可经受93磅的拉伸强度,除了长尖利牙齿的超级大鱼,想把它咬断几乎不可能。

最初霍宾斯把造出的“铁甲”卖给当地商店,用户纷纷赞扬这种鱼饵也有环保功能,因为它轻易不会脱落并沉到水底。受此启发,霍宾斯再接再厉,抛弃有毒的塑料,改用硅树酯材料。如果被鱼儿扯掉带走,硅树酯饵会逐渐生物降解,而不是像塑化聚氯乙烯制成的软鱼饵那样释放出有毒物质。在两种版本的鱼饵上,霍宾斯都不使用能增强弹性的可塑剂,那是用邻苯二甲酸酯制成,美国国会明确禁止用于儿童玩具。现在环保型“铁甲”正接受测试,预计今年可以出现在商店货架上。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061831596570.jpg[/img]

[color=#a0aaac]————————————————————————————————-[/color]

马萨诸塞州德汉姆市一家Finz连锁餐厅后面,有个高六英尺的箱子,看上去像个普通的工具箱,事实上却是一个设备齐全、可独立运作的废油精炼厂兼功率五千瓦的发电站。工程师詹姆斯·佩雷特这个名为Vegawatt的发明是全球首个利用废油为建筑持续提供电力和热水的装置。

去年12月,在经历了每周80小时的苦干后,33岁的佩雷特在Finz安装了第一台Vegawatt发电机。Finz的油炸海鲜颇为出名,每天餐馆员工会往Vegawatt里倒进10到12加仑的废弃食油。这些掺杂着大量面包屑的垃圾先是被送入一个储存槽,进行沉淀,再经过滤、清洁和处理程序后,进入一个容器,供给一台15马力的柴油发电机作燃料。佩雷特设法将排气系统内的热量引进来,与之结合进行燃烧。Vegawatt发动机冷却液散发出来的热量也被利用来为餐馆提供热水,进一步降低了能耗。

Vegawatt售价2.2万美元,月租435美元,每周可以处理大约80加仑废油(约为一个大型餐馆的标准用量),每小时生产5千瓦电力,每周节省1000美元,减少10%的能源成本。佩雷特刚刚建立了OwlPower公司进行推销,将Vegawatt宣传为环保省钱、又能帮助供应美味薯条和炸鱼片的新奇机器。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061832196300.jpg[/img]

[color=#a0aaac]————————————————————————————————–[/color]
艾本·巴耶尔和盖文·迈金泰尔准备用蘑菇为你建房。这两位年轻的企业家制造出一种成本很低但强度很高的生物材料,可以取代昂贵并有害于环境的聚苯乙烯泡沫材料和塑料,这两者是广泛使用的墙体隔热防火和包装材料,风力涡轮的叶片和汽车车体面板上也常用到它们。

“我们称之为低技术含量的生物技术,”巴耶尔说。在实验室内,两位发明者用水、过氧化氢、淀粉、再生纸和稻壳等农业废弃品做成模具,然后注入菌丝,它是蘑菇的根体,看上去就像一束束白色的纤维。这些纤维消化养料,10到14天后就会发育成一张紧密的网络,把模具变成结构坚固的生物复合板(一张一立方英寸的Greensulate板材内含有的菌丝连接起来长达八英里)。然后再用高温加以烘烤,阻止菌丝继续生长。两周之后,板材制作完成,可以用于你家墙体了。

巴耶尔和麦金泰尔同是伦斯勒理工学院机械工程系学生。决定制造生物板材后,他们用特百惠保鲜盒种过各种蘑菇,做了许多样品,实验证明这种复合板具有非同寻常的性质:制作过程中无须加入热源或光照等能量,不需要昂贵的设备,在室温和黑暗环境中就可以生长;菌丝体将稻壳包围在紧密编织的网中,产生微小的绝缘气囊,一英寸厚的Greensulate隔热值高达3,与一英寸厚的玻璃纤维隔热板相当,经得起600摄氏度的高温;你可以根据需要设计其形状、强度和弹性,任何规格的Greensulate隔热板都只需5~14天即可完成。与现有的化工产品相比,它减少了8至10倍的二氧化碳排放和4至5倍的能源需求,成本低但使用寿命长,废弃后可直接埋入土中分解成堆肥。

2007年,两人创立了EcovativeDesign公司,通过全国大学发明和创新者联盟(NCIIA)获得了16000美元的资金。一年后,现任首席运营官艾德·布卢卡和其他成员加入,大家共同合作,在阿姆斯特丹举行的“荷兰绿色创意挑战杯”比赛中获得50万欧元奖金。

目前,这种蘑菇板材已经试用于佛蒙特州一家学校的体育馆,两位发明者希望年底能够完成所有工业认证和测试,达到美国试验与材料协会(ASTM)的标准。到那时,人们可能再也没有理由使用常规的化工材料。
[img]http://postimg1.mop.com/201001/06/71/3872171/201001061832402710.jpg[/img]

2010年01月13日

阿凡达——3D电影的新纪元

类归于: film — 标签:, — tangtang @ 7:47 下午

昨天去UME买阿凡达的电影票,没想到还是爆满。正巧碰到高同学和他太太,于是聊了聊。据说,他的朋友周一上午10点半来排队买票,当时就已经有很多人了,而且,只剩下最前面和最后面的位子了。

阿凡达,开创了3D电影的新纪元。

早前文章 »

WordPress 所驱动